이 책을 참조해 최신 개발 환경(2022년도 기준) 에서 진행하였습니다.

  • Spring Boot 2.6.5
  • gradle 7.1.1
  • Java 11

2장 테스트 코드 작성하기

이번 장에서는 HelloController 를 만들어 테스트 코드를 작성하는 연습을 했다. jUnit5 사용해서 이에 맞는 코드의 최신화가 필요했다.

MVC 단위 테스트

  • @ExtendWith
    - 확장을 선언적으로 등록해 주는 역할을 한다. Extendtion 뒤에 인자로 확장할 Extension을 추가하여 사용 할 수 있다.
    -Spring을 사용할 경우 @ExtendWith(SpringExtension.class)와 같이 사용한다.
  • @WebMvcTest
    - Web(Spring MVC)를 위한 테스트이다.
    - @Controller, @ControllerAdvice 등을 사용 할수 있다. 따라서 테스팅이 비교적 가볍다.
    • 주의 할 점은 @Service, @Component, @Repository 등은 사용할 수 없다.
    • 이번 테스트는 단순하게 HelloController 만을 테스트 하는 것이므로 사용했다.
  • @Autowired
    - 스프링이 관리하는 빈(Bean)을 주입 받는다.
  • private MockMvc mvc
    - 웹 API를 테스트 할 때 사용한다.
    • 스프링 MVC 테스트의 시작점이다.
    • HTTP GET, POST 등에 대한 API 테스트를 할 수 있다.

@ExtendWith(SpringExtension.class)
@WebMvcTest
public class HelloControllerTest {

 	@Autowired
    private MockMvc mvc;
 
 ...이하 책이나 깃허브를 참조해 주세요...
 
}

🚨 주의점과 오류

@WebMvcTest 와 @SpringBootTest 같이 사용할 수 없다. 만약 같이 사용하고자 한다면 이런 에러를 만날 것이다..

Test ignored.
java.lang.IllegalStateException: Configuration error: found multiple declarations of @BootstrapWith for test class

이유는 에러 메시지처럼 @WebMvcTest 와 @SpringBootTest 모두 @BootstrapWith 를 포함하기때문에 중첩되는 문제가 발생하는 것이다.
사실상 이 테스트에서는 Controller 만 테스트 하는 것이라 @SpringBootTest 를 쓸 일이 없는데 나는 중간에 내 실수때문에 다른 이슈를 만났고 이를 해결하고자 사용하려했지만 실패했다. 이에 대해선 다음 글을 참조하면 된다.
[ jUnit5 ] java.lang.AssertionError: Status expected:<200> but was:<406> 에러

테스트에 따른 어노테이션 정리

Spring MVC 테스트Spring 통합테스트
@ExtendWith(SpringExtension.class)@SpringBootTest
@WebMvcTest

마무리

참조 및 인용

[Spring 프로젝트] Junit5 테스트 코드 작성하기 (Junit4와 차이점 정리)

1) Spring boot 단위테스트 1부 - @Service 영역테스트

docs.spring.io

0개의 댓글