Junit 테스트 시 @SpringBootTest와 @WebMvcTest를 대표적으로 사용
두가지의 차이점을 알아보자!
@SpringBootTest
- 프로젝트의 내부에 있는 모든 스프링 빈을 등록 => 속도가 느리고, 통합 테스트를 할 때 많이 사용
- 수많은 스프링 빈을 등록하여 테스트에 필요한 의존성을 주입
@WebMvcTest
- MVC 부분 슬라이드 테스트로, 보통 컨트롤러 하나만 테스트를 하고자 할 때 사용
- WebMvcTest()의 프로퍼티로 테스트를 원하는 컨트롤러의 클래스를 넣어주어야 함
Ex) @WebMvcTest(ExampleController.class) - @WebMvcTest 어노테이션 사용 시에 가끔 NoSuchBeanDefinitionException 오류가 발생
- 원인 : @WebMvcTest는 @Controller 같은 웹과 관련된 빈만 주입되어 @service와 같은 일반적인 @Component는 생성되지 않는 특성이 있어, 해당 컨트롤러를 생성하는데 필요한 다른 빈을 정의하지 못해 발생
- 해결 : @MockBean을 사용하여 필요한 의존성을 채워주어야 해결
Mock이란?
- 테스트 작성을 위한 환경 구축이 어렵거나, 테스트가 특정 경우 및 순간에 의존적인 경우 테스트 작성 시간을 단축하기 위해 사용
- 실제 객체를 흉내낸 가짜 객체
- Mock 객체는 Mock일 뿐, 실체 객체를 작동했을 때 예상과 다르게 작동할 수 있음
MockBean이란?
- Mock 객체를 빈으로 등록
- Spring의 ApplicationContext는 Mock 객체를 빈으로 등록하며, 이미 동일한 타입의 동일한 객체가 빈으로 등록되어있을 경우, 해당 빈은 선언한 @MockBean으로 대체
@SpringBootTest와 @WebMvcTest 차이
@SpringBootTest
- MockMvc 객체를 빈으로 등록하지 않기 때문에 @AutoConfigureMockMvc로 빈을 등록
- 프로젝트에 있는 스프링 빈을 모두 등록하여 테스트에 필요한 의존성 추가
- 장점
- 프로젝트에 있는 모든 스프링 빈을 등록하므로, 테스트에 필요한 객체를 주입받아 쉽게 사용 가능
- 실제 환경과 가장 유사한 테스트 가능
- 단점
- 모든 스프링 빈을 등록하므로, 전체 컨텍스트를 로드하여 빈을 주입하기에 속도가 느림
- 테스트 단위가 크기 때문에 디버깅이 어려울 수 있음
- 결론
- @SpringBootTest의 경우 전체 프로그램의 작동이 제대로 이루어지는지 검증하는 통합테스트에 많이 사용
@WebMvcTest
- MockMvb 객체를 빈으로 등록하여 @Autowired로 MockMvc 주입이 가능
- Web Layer 관련 빈들만 등록하기에 @Component로 등록한 빈은 @MockBean으로 등록해야 함
- 장점
- Web Layer 관련 빈만 로드하기에 상대적으로 @SpringBootTest보다 속도가 빠름
- 통합테스트에서 테스트가 어려운 작은 단위 테스트를 진행 가능
- 단점
- Mock 객체를 사용하기 때문에 실제 환경에서는 다른 오류가 발생 가능!
- 결론
- @WebMvcTest의 경우 컨트롤러 테스트, 단위 테스트에 많이 사용
728x90