본문 바로가기

Web/Spring & Spring Boot

[Spring Boot] @SpringBootTest와 @WebMvcTest

반응형

SpringBoot에서 JUnit5을 사용하여 테스트 코드를 작성할 때

@SpringBootTest 어노테이션을 자주 쓰게 되는데, 

상황에 따라서는 @WebMvcTest를 쓰는게 좋을 때도 있다.

 

+ 테스트를 쉽게 하기 위해서 요청을 수행하고 응답을 만들어내는 mock 객체를 사용한다.

이럴 때 사용되는 객체가 여러가지 존재하지만 대표적으로 MockMvc를 많이 사용한다.

 

@SpringBootTest + @AutoConfigureMockMvc

 @SpringBootTest는 프로젝트의 전체 컨텍스트를 로드하여 빈을 주입하기 때문에 속도가 느리고, 통합 테스트를 할 때 많이 사용한다.

 수많은 스프링 빈을 등록하여 테스트에 필요한 의존성을 추가하기 때문에, 필요한 빈만을 등록하여 테스트를 진행하고자 한다면 슬라이스 테스트 어노테이션인 @WebMvcTest를 사용하는 것이 더 효율적이다.

 

@WebMvcTest

 @WebMvcTest는 MVC 부분 슬라이스 테스트로, 보통 컨트롤러 하나만 테스트하고 싶을 때 사용한다.

 @WebMvcTest()의 프로퍼티로 테스트를 원하는 컨트롤러 클래스를 넣어준다.

 (참고: 위의 @SpringBootTest에는 @ExtendWith(SpringExtension.class)가 포함되어있음)

 이 어노테이션을 쓰는 경우에는 가끔 NoSuchBeanDefinitionException 오류가 나는데,

@WebMvcTest는 @Controller같은 웹과 관련된 빈만 주입되며 @Service와 같은 일반적인 @Component는 생성되지 않는 특성 때문에 해당 컨트롤러를 생성하는 데 필요한 다른 빈을 정의하지 못해 발생한다.

 따라서 이런 경우에는 @MockBean을 사용해서 필요한 의존성을 채워주어야 한다.

반응형

'Web > Spring & Spring Boot' 카테고리의 다른 글

[Spring MVC] Controller에서 여러 Service 호출?  (0) 2021.06.01