Lombok 설정 및 테스트

  • VO(DTO) 생성 시 Getter, Setter, Contructor, toString 등을 어노테이션으 자동 생성

build.gradle dependency 추가

  • lombok 의존성 추가
dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile("org.projectlombok:lombok")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}    

lombok plugin 설치

  • lombok plugin 설치

lombok 설정

  • lombok 플러그인은 한 번만 설치
  • build.gradle에 라이브러리 추가와 Enable annotation.processing체크는 프로젝트마다 설정해야 한다.

lombok으로 Refactoring

  • web 패키지에 dto 패키지를 추가

com.seok.sample.web.dto.HelloResponseDto 추가

  • dto 패키지에 HelloResponseDto 추가

    1. @Getter

      • 선언된 모든 필드의 get 메서드를 생성
    2. @RequiredArgsContructor

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

      • final이 없는 필드는 생성자에 포함되지 않는다.

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
    private final String name;
    private final int amount;
}

lombok 테스트

  • 테스트 코드

    1. assertThat
      • assertj라는 테스트 검증 라이브러리의 검증 메서드
      • 검증하고 싶은 대상을 메서드 인자로 받는다.
      • 메서드 체이닝이 지원되어 isEqualTo와 같이 메서드를 이어서 사용할 수 있다.
    2. isEqualTo
      • assertj의 동등 비교 메서드
      • assertThat에 있는 값과 isEqualTo의 값을 비교해서 같은 경우 성공
  • assetj vs Junit

    • CoreMatchers와 달리 추가적으로 라이브러리가 필요하지 않다.
      • Junit의 assertThat을 쓰게 되면 is()와 같이 CoreMatchers 라이브러리가 필요하다.
    • 자동완성이 좀 더 확실하게 지원
      • IDE에서는 CoreMatchers와 같은 Matcher 라이브러리의 자동완성 지원이 약하다.
  • HelloResponseDtoTest

    • given, when, then의 순서로 테스트 코드를 작성
    1. Given
      • HelloResponseDto 클래스에 생성자로 주입될 값을 설정
      • 테스트 기반 환경을 구축하는 단계
    2. When
      • HelloResponseDto 클래스 생성 및 초기화
      • 테스트 하고자 하는 행위 선언
    3. Then
      • 테스트의 결과를 검증
      • assertThat 메서드를 통해 HelloResponseDto instance의 name, amount의 값을 확인
      • assertThat 성공으로 lombok의 @Getter를 통해 get 메서드, @RequiredArgsContructor로 생성자가 자동으로 생성
import org.assertj.core.api.Assertions;
import org.junit.Test;

public class HelloResponseDtoTest {
    @Test
    public void lombok_test() {
        // Given
        String name = "test";
        int amount = 1000;
        // when
        HelloResponseDto dto = new HelloResponseDto(name, amount);
        // then
        Assertions.assertThat(dto.getName()).isEqualTo(name);
        Assertions.assertThat(dto.getAmount()).isEqualTo(amount);
    }
}

HelloController에 ResponseDto 사용

  • HelloController
    • @RequestParam
      • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
      • name (@RequestParam("name"))이란 이름으로 넘긴 파라미터를 메서드 파라미터 name(String name)에 저장
@RestController
public class HelloController {

    ...

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

}

HelloController 테스트

  • HelloControllerTest
    1. param
      • API 테스트 할 때 요청 파라미터를 설정
      • 단, 그 값은 String만 허용
      • 숫자/날짜 등의 데이터도 등록하는 경우 문자열로 변경이 필요 (String.valueOf(value))
    2. jsonPath
      • JSON 응답값을 필드별로 검증할 수 있는 메서드
      • $를 기준으로 필드명을 명시
      • 여기서는 name, amount를 검증하니 $.name, $.amount로 검증
@RunWith(SpringRunner.class)
@WebMvcTest
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    ...

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

        mvc.perform(
                get("/hello/dto")
                .param("name", name)
                .param("amount", String.valueOf(amount))
        )
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.name", is(name)))
        .andExpect(jsonPath("$.amount", is(amount)));
    }
}
  • 결과 테스트
    • MockHttpServletResponse.Body
    MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json;charset=UTF-8"]
     Content type = application/json;charset=UTF-8
             Body = {"name":"hello","amount":1000}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

+ Recent posts