SpringBoot환경에서 테스트코드를 작성할 때 대다수 JUnit5을 사용하고,
@SpringBootTest 어노테이션 혹은 @WebMvcTest를 사용한다.
둘의 차이점을 알아보자
📕 @SpringBootTest
- 프로젝트의 전체 컨텍스트를 로드하여 빈을 주입하기 때문에 속도가 느리고, 통합 테스트를 할 때 많이 사용한다.
- 컴포넌트 스캔 범위는 Bean 전체이다.
즉, 애플리케이션이 실행할 당시 스캔되는 범위와 동일하다. - 애플리케이션의 모든 설정을 가져오기 때문에 애플리케이션의 범위가 넓을수록 테스트가 느려질 수 밖에 없고,
이는 단위테스트에 적절하지 않다.
📕 @WebMvcTest
- Web 테스트 중에서 MVC테스트를 하는데 사용하며 컴포넌트 스캔의 범위는 스프링 컨테이너에서
Presentation Layer에 속하는 빈들만 등록한다. - 웹상에서 요청과 응답에 대한 테스트를 진행한다. 그렇기에 보통 MockMvc와 함께 사용한다.
- 컴포넌트 스캔 대상이 제한적이기 때문에 기존 SpringBootTest에 비해 속도가 빠르다.
- @Autowired와 같은 빈 등록 애노테이션을 사용할 수 없다. 그렇기에 @MockBean 이나 혹은 mock(), spy()등을
이용해 해당 메서드를 mocking해줘야한다.
📕 MockMvc
- Mock : 실제 객체를 만들어서 테스트하기가 어려운 경우에, 가짜 객체를 만들어서 테스트하는 기술
- MockMvc
- MVC에 관련된 Mock 가짜 객체
- 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고, 테스트용 MVC 환경을 만들어서
요청 및 전송, 응답 기능을 제공해주는 객체