웹 애플리케이션에서 컨트롤러를 테스트할 때, 서블릿 컨테이너를 모킹하기 위해서는 @WebMvcTest를 사용하거나 @AutoConfigureMockMvc를 사용하게 되는데 이 어노테이션들에 대해 알아보겠습니다.
@WebMvcTest
일반적으로 사용하는 MVC 테스트용 어노테이션입니다. 해당 어노테이션을 명시하고 아래와 같이 MockMvc
를 @Autowired
하면 해당 객체를 통해 MVC테스트가 가능합니다.
이 어노테이션을 사용하면 MVC 관련 설정인 @Controller, @ControllerAdvice, @JsonComponent와 Filter, WebMvcConfigurer, HandlerMethodArgumentResolver만 로드되기 때문에, 실제 구동되는 애플리케이션과 똑같이 컨텍스트를 로드하는 @SpringBootTest 어노테이션보다 가볍게 테스트 할 수 있습니다.
또한 @Service나 @Repository가 붙은 객체는 테스트 대상이 아닌 것으로 처리되기 때문에 생성되지 않습니다.
@AutoConfigureMockMvc
@WebMvcTest 와 비슷하게 사용할 수 있는 어노테이션이지만 @WebMvcTest와 다르게 컨트롤러 뿐만 아니라 테스트 대상이 아닌 @Service나 @Repository가 붙은 객체 모두 메모리에 올려 테스트가 가능합니다. @AutoConfigureMockMvc
은 @SpringBootTest
와 같이 사용 가능합니다.
여기서 드는 의문점은 @AutoConfigureMockMvc과 @SpringBootTest는 왜 같이 사용해야 할까요?
그 이유는 @SpringBootTest가 MockMvc 객체를 생성하지 못하기 때문에 @AutoConfigureMockMvc를 이용하여 MockMvc 객체를 사용할 수 있도록 하기 때문 입니다.
참고
| @WebMvcTest는 @SpringBootTest와 같이 사용될 수 없습니다. 왜냐하면 각자 서로의 MockMvc를 모킹하기 때문에 충돌이 발생하기 때문입니다.