Framework & Library/Spring

[Java / Spring] 스프링부트 테스트 어노테이션 @SpringBootTest와 @WebMvcTest

마볼링 2023. 8. 7. 17:18
SpringBoot환경에서 테스트코드를 작성할 때 대다수 JUnit5을 사용하고,
@SpringBootTest 어노테이션 혹은 @WebMvcTest를 사용한다.
둘의 차이점을 알아보자

 

📕 @SpringBootTest

  • 프로젝트의 전체 컨텍스트를 로드하여 빈을 주입하기 때문에 속도가 느리고, 통합 테스트를 할 때 많이 사용한다.
  • 컴포넌트 스캔 범위는 Bean 전체이다.
    즉, 애플리케이션이 실행할 당시 스캔되는 범위와 동일하다.
  • 애플리케이션의 모든 설정을 가져오기 때문에 애플리케이션의 범위가 넓을수록 테스트가 느려질 수 밖에 없고,
    이는 단위테스트에 적절하지 않다.

 

📕 @WebMvcTest

  • Web 테스트 중에서 MVC테스트를 하는데 사용하며 컴포넌트 스캔의 범위는 스프링 컨테이너에서
    Presentation Layer에 속하는 빈들만 등록한다.
  • 웹상에서 요청과 응답에 대한 테스트를 진행한다. 그렇기에 보통 MockMvc와 함께 사용한다.
  • 컴포넌트 스캔 대상이 제한적이기 때문에 기존 SpringBootTest에 비해 속도가 빠르다.
  • @Autowired와 같은 빈 등록 애노테이션을 사용할 수 없다. 그렇기에 @MockBean 이나 혹은 mock(), spy()등을
    이용해 해당 메서드를 mocking해줘야한다.

 

📕 MockMvc

  • Mock : 실제 객체를 만들어서 테스트하기가 어려운 경우에, 가짜 객체를 만들어서 테스트하는 기술
  • MockMvc
    • MVC에 관련된 Mock 가짜 객체
    • 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고, 테스트용 MVC 환경을 만들어서
      요청 및 전송, 응답 기능을 제공해주는 객체