롬복 Lombok

iseon_u·2023년 3월 22일
0

Book

목록 보기
3/16
post-thumbnail

CH02 - 롬복 Lombok


  • Getter, Setter, 기본 생성자, toString 등을 어노테이션으로 자동 생성

build.gradle

implementation('org.projectlombok:lombok')

Hello Controller 코드를 롬복으로 전환

  • 롬복으로 전환 후 테스트 코드로 정상 작동 확인

HelloResponseDto.java

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

import lombok.Getter; // 1
import lombok.RequiredArgsConstructor; // 2

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
    
    private final String name;
    private final int amount;
    
}
  1. @Getter
    • 선언된 모든 필드의 get 메소드를 생성
  2. @RequiredArgsConstructor
    • 선언된 모든 final 필드가 포함된 생성자를 생성
    • final이 없는 필드는 생성자에 포함되지 않습니다

HelloResponseDtoTest.java

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

import org.junit.Test;

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

public class HelloResponseDtoTest {

    @Test
    public void 롬복_기능_테스트() {
        //given
        String name = "test";
        int amount = 1000;

        //when
        HelloResponseDto dto = new HelloResponseDto(name, amount);

        //then
        assertThat(dto.getName()).isEqualTo(name); // 1, 2
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}
  1. assertThat
    • assertj 라는 테스트 검증 라이브러리의 검증 메소드
    • 검증하고 싶은 대상을 메소드 인자로 받는다
    • 메소드 체이닝이 지원되어 isEqualsTo 와 같이 메소드를 이어서 사용 가능
  2. isEqualTo
    • assertj 의 동등 비교 메소드
    • assertThat 에 있는 값과 isEqualTo 의 값을 비교해서 같을 때만 성공

JUnit 과 비교하여 assertj 의 장점

  • CoreMatchers 와 달리 추가적으로 라이브러리가 필요하지 않는다
  • 자동완성이 확실하게 된다

Controller 에서 ResponseDto 사용

@GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount) {
        return new HelloResponseDto(name, amount);
    }
  • @RequestParam
    • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션

API 테스트 코드

package com.pgrrr.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.security.test.context.support.WithMockUser;
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)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @WithMockUser(roles = "USER")
    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";
        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }

    @WithMockUser(roles = "USER")
    @Test
    public void helloDto가_리턴된다() throws Exception {
        String name = "hello";
        int amount = 1000;
        mvc.perform(
                        get("/hello/dto")
                                .param("name", name) // 1
                                .param("amount", String.valueOf(amount)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name))) // 2
                .andExpect(jsonPath("$.amount", is(amount)));
    }
}
  1. param
    • API 테스트할 때 사용될 요청 파라미터를 설정
    • 값은 String 만 허용
    • 다른 유형의 데이터도 문자열로 변경해 등록
  2. jsonPath
    • JSON 응답값을 필드별로 검증할 수 있는 메소드
    • $ 를 기준으로 필드명을 명시
profile
🧑🏻‍💻 Hello World!

0개의 댓글