웹 어플리케이션에서 Controller 를 테스트할 때, 서블릿 컨테이너를 모킹하기 위해서는 @WebMvcTest
나 @AutoConfigureMockMvc
를 사용한다. 웹 환경에서 Controller 를 테스트하려면 반드시 서블릿 컨테이너가 구동되고 DispatcherServlet 객체가 메모리에 올라가야 한다. 하지만 서블릿 컨테이너를 모킹하면 실제 서블릿 컨테이너가 아닌 테스트용 모형 컨테이너를 사용하기 때문에 간단하게 Controller 를 테스트할 수 있다.
Controller
를 테스트한다.@Controller
, @RestController
가 설정된 클래스들을 찾아 메모리에 설정한다.@Service
나 @Repository
가 붙은 객체들은 테스트 대상이 아닌 것으로 처리되기 때문에 생성되지 않는다.
@WebMvcTest
가 설정된 테스트 케이스에서는 서블릿 컨테이너를 모킹한 MockMvc
타입의 객체를 목업하여 컨트롤러에 대한 테스트코드를 작성할 수 있다.@WebMvcTest
어노테이션을 사용하면 MVC 관련 설정인 @Controller
, @ControllerAdvice
, @JsonComponent
와 Filter, WebMvcConfigurer, HandlerMethodArgumentResolver 만 로드되기 때문에 실제 구동되는 어플리케이션과 똑같이 컨텍스트를 로드하는 @SpringBootTest
어노테이션보다 가볍게 테스트할 수 있다.@DisplayName("지하철역 관련 Controller 테스트")
@WebMvcTest(StationController.class)
class StationControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private StationService stationService;
// 생략
}
위 예시 코드는 우아한테크코스 지하철 노선도 미션 중 지하철역 Controller 테스트이다. StationController 만 테스트할 것이기 때문에 @WebMvcTest(StationController.class)
으로 설정해두었다. 또, StationController 는 StationService 를 주입받아 사용하기 때문에 @MockBean
을 이용하여 가짜 객체로 생성하였다.