문제
Controller에 대한 Test를 진행하기 위해 @WebMvcTest를 진행했다. @SpringBootTest는 모든 구성 요소를 로드해서 실제 실행과 같은 환경에서 테스트를 진행하기 때문에 매우 무겁다는 단점이 있어 Controller에 대한 테스트는 @WebMvcTest를 사용하는 것으로 알고있어서 선택한 것이었다.
하지만 @WebMvcTest가 어떻게 동작하는지에 대해 모르는 상태였고, 그에 따라 "jpa metamodel must not be empty!" 라는 에러 메세지를 만나게 되었고, 문제를 해결하면서 @WebMvcTest에 대해 공부해보았다.
원인
jpa metamodel must not be empty는 Auditing 관련 빈을 생성하지 않고 @EnableJpaAuditing을 사용했을 때 발생하는 에러다.
이 에러가 발생한 이유는 JPA Auditing을 사용하면서 application 파일에 @EnableJpaAuditing을 붙여주었고, WebMvcTest가 실행되면서 Auditing 관련 빈들이 스캔 대상에서 제외된 상태로 Application의 @EnableJpaAuditing을 스캔했기 때문이다.
@WebMvcTest란?
Spring Slice Test로 웹 계층에 중점을 둔 테스트이다.
슬라이스 테스트란?
@SpringBootTest를 통해 모든 빈을 등록해서 테스트 할 수 있지만, 모든 빈을 등록하면 불필요한 빈까지 등록해서 리소스가 낭비된다는 문제가 있다. 이러한 문제를 해결하기 위해 각 계층에 맞는 테스트를 진행하는 것이 슬라이스 테스트이다.
대표적인 슬라이스 테스트 어노테이션으로 @WebMvcTest, @WebFluxTest, @DataJpaTest, @JsonTest, @RestClientTest가 있다.
@WebMvcTest는 웹 계층 테스트에 필요한 @Controller, @ControllerAdvice, @JsonComponent Filter, WebMvcConfigurer, HandlerMethodArgumentResolver와 같은 빈들만 적용이 되고, @Component, @Service, @Repository와 같은 빈들은 적용되지 않는다.
또한 @AutoConfigureMockMvc를 통해 @Configuration Bean을 @Import로 추가해서 해당 설정을 적용시킬 수 있고, @MockBean으로 Controller에서 호출하는 @Service Bean을 등록해서 사용하는 등 컨트롤러 테스트에 필요한 빈을 등록할 수 있다.
Reference
Spring Boot Docs 2.0.0.M1 API
docs.spring.io
https://tecoble.techcourse.co.kr/post/2021-05-18-slice-test/
Spring Boot 슬라이스 테스트
Spring Boot…
tecoble.techcourse.co.kr
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!