본문 바로가기
Book/스프링 부트와 AWS 웹 서비스

[Spring Boot] 테스트 코드 작성하기

by 달의 조각 2023. 2. 8.
이 글은 이동욱 님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 읽으며 정리한 글입니다.

 

  TDD란, 테스트가 주도하는 개발을 말한다. 테스트 코드를 먼저 작성하는 것부터 시작한다. 반면 단위 테스트는 TDD의 첫 번째 단계인 기능 단위의 테스트 코드를 작성하는 것을 말한다.

단위 테스트는 개발 단계 초기에 문제를 발견하도록 돕고, 나중에 코드를 리팩토링 하는 등 코드 변경이 있을 때 기존 기능이 올바르게 작동하는지 쉽게 확인이 가능해서 안전하다. 또한 Postman 같은 API 테스트 도구로 하나하나 테스트 하는 번거로움을 줄일 수 있어서 효율적이다.

 


 

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 앞으로 만들 프로젝트의 메인 클래스이다. 설정을 읽는 시작점이므로 항상 프로젝트 최상단에 위치해야 한다.
  • @SpringBootApplication: 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 자동으로 설정한다.
  • SpringApplication.run으로 내장 WAS를 실행한다. (서버에 톰캣을 설치할 필요가 없고, Jar 파일로 실행하면 된다.)

 

@ExtendWith(SpringExtension.class) // junit5
@WebMvcTest(controllers = HelloController.class,
        excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class)
        }
)
public class HelloControllerTest {

    @Autowired // 스프링이 관리하는 빈을 주입받는다.
    private MockMvc mvc;

    @Test
    public void hello가_리턴된다() throws Exception {
        String hello = "hello";

        mvc.perform(get("/hello")) // HTTP GET 요청
                .andExpect(status().isOk()) // 결과 검증
                .andExpect(content().string(hello));
    }
}
  • @ExtendWith: Mockito Mock 객체를 사용하기 위한 어노테이션이다.
  • @WebMvcTest: Web(Spring MVC)에 집중할 수 있는 어노테이션이다. @Controller, @ControllerAdvice를 사용할 수 있다. @Service, @Component, @Repository는 사용할 수 없다. JPA 기능이 작동하지 않는다. JPA 기능까지 한 번에 테스트하려면 @SpringBootTest와 @TestRestTemplate를 사용한다.
  • MockMvc: 웹 API를 테스트 할 때 사용하며(HTTP GET, POST 등), 스프링 MVC 테스트의 시작점이다.

 

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);
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}
  • assertThat: 검증 라이브러리 assertj의 검증 메서드로, 검증하고 싶은 대상을 메소드 인자로 받는다.
  • isEqualTo: assertj의 동등 비교 메소드이다. assertThat에 있는 값과 비교해서 같을 경우 성공한다.

 

@Test
public void helloDto가_리턴된다() 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)));
}
  • jsonPath: JSON 응답값을 필드별로 검증한다. $를 기준으로 필드명을 명시한다.

 

  • @RestController: 컨트롤러를 JSON을 반환하는 컨트롤러로 만든다. @ResponseBody를 한 번에 사용할 수 있게 한다.
  • @RequiredArgsConstructor: 선언된 모든 final 필드가 포함된 생성자를 생성한다. final이 없으면 포함되지 않는다.

댓글