스프링 부트에서 테스트코드 작성

TDD(테스트 주도 개발) 와 단위테스트(Unit Test) 는 다르다


  • HelloResponseDto.java 와 테스트 코드인 HelloResponseDtoTest.java


package com.anse.book.springboot.web.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter                     // 선언된 모든 필드의 get 메서드를 생성
@RequiredArgsConstructor    // final로 선언된 모든 필드가 포함된 생성자를 생성
public class HelloResponseDto {
   private final String name;
   private final int amount;
}


package com.anse.book.springboot.web.dto;

import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;


public class HelloResponseDtoTest {
   @Test
   public void rombokTest() {
       String name = "test";
       int amount = 1000;

       HelloResponseDto dto = new HelloResponseDto(name, amount);

       assertThat(dto.getName()).isEqualTo(name);
       assertThat(dto.getAmount()).isEqualTo(amount);
       /*
           assertThat
               - assertj 라는 테스트 검증 라이브러리의 검증 메서드
               - 검증하고 싶은 대상을 메서드 인자로 받음
               - 메서드 체이닝이 지원되어 isEqualTo와 같이 이어서 사용 가능
           isEqualTo
               - assertj의 동등 비교 메서드
               - 두개의 값이 같을 때만 성공
        */
  }
}


  • HelloController.java 와 테스트 코드인 HelloControllerTest.java

package com.anse.book.springboot.web;

import com.anse.book.springboot.web.dto.HelloResponseDto;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

   @GetMapping("/hello")
   public String hello() {
       return "hello";
  }

   @GetMapping("/hello/dto")
   public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount) {
       return new HelloResponseDto(name, amount);
  }
}


package com.anse.book.springboot.web;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;


import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

/*
   @RunWith(SpringRunner.class)
       - 스프링 부트 테스터와 Junit 사이에 연결자 역할
       - SpringRunner라는 스프링 실행자를 실행

   @WebMvcTest
       - Web(Spring MVC) 에 집중할 수 있는 어노테이션
       - @Controller, @ControllerAdvice 등을 사용할 수 있으나 @Service, @Component, @Repository는 사용 못함
*/
@RunWith(SpringRunner.class)
@WebMvcTest
public class HelloControllerTest {

   @Autowired
   private MockMvc mvc;    // 웹 API 테스트 할 때 사용하고 스프링 MVC테스트의 시작점
                           // 이를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다

   @Test
   public void hello() throws Exception {
       String hello = "hello";

       mvc.perform(get("/hello"))      // MockMvc를 통해 /hello 주소로 HTTP get 요청
              .andExpect(status().isOk())         // HTTP Header의 Status를 검증 (200인지)
              .andExpect(content().string(hello));// 응답 본문의 내용을 검증
                                                   // Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증
  }

   @Test
   public void helloDto_return() throws Exception {
       String name = "hello";
       int amount = 1000;

       mvc.perform(get("/hello/dto")
              .param("name", name)
              .param("amount", String.valueOf(amount)))
                  .andExpect(status().isOk())
                  .andExpect(jsonPath("$.name", is(name)))
                  .andExpect(jsonPath("$.amount", is(amount))
              );

       /*
           .param
               - API 테스트할때 요청 파라미터 (String 만 가능)
           .jsonPath
               - JSON 응답값을 필드별로 검증할 수 있는 메서드
               - $를 기준으로 필드명을 명시하니 $.name,$.amount로 검증
        */
  }
}


어노테이션 정리

@Getter

  • 선언된 모든 필드의 get메서드를 생성

@ReqiredArgsConstructor

  • final로 선언된 모든 필드가 포함된 생성자를 생성

@RunWith(SpringRunner.class)

  • 스프링부트 테스터와 Junit사이에 연결자 역할

  • SpringRunner라는 스프링 실행자를 실행

@webMvcTest

  • Web(Spring MVC) 에 집중할 수 있는 어노테이션

  • @Controller, @ControllerAdvice 등을 사용할 수 있고

  • @Service, @Component, @Repository 는 사용 못함


+ Recent posts