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 |
---|