문제상황
@WebMvcTest Controller 단위테스트를 마친뒤, Jpa Auditing 기능을 사용하기 위해 StockMateApplication에 @EnableJpaAuditing 애너테이션을 추가하자 기존에 성공하던 테스트들에서 다음과 같은 에러가 발생했다.
에러 메세지를 보아하니 jpaMappingContext 빈이 없어 발생하는 문제같다.
시도한 점
@WebMvcTest는 컨트롤러 레이어를 테스트하는데에 특화되어있어 Controller, RestController, Resolver 등 Spring MVC와 관련된 빈들만 자동으로 등록한다.
우선 WebMvcTest 시 등록되는 빈들을 확인해보았다.
출력되는 빈들은 꽤 많았고 모두 위에서 설명한 것처럼 Controller, Resolver 등 MVC와 관련된 컴포넌트들이었다.
(추가로 InventoryController에서 의존성 주입을 받기 위해 등록한 InventoryService까지)
그리고 다음 사진과 같이 ApplicationClass도 있었다.
이로써 에러의 원인은 나왔다.
WebMvcTest시 stockMateApplication도 빈으로 등록하고 있고,
에러가 발생한 환경에서 StockMateApplication 클래스는 @EnableJpaAuditing 로 인해 Jpa관련 빈들을 필요로 한다.
그리고 WebMvcTest시에는 StockMateApplication에서 필요로 하는 Jpa 관련 빈이 없다.
이후 구글링을 통해 JpaAuditing 사용 시 JpaMetamodelMappingContext가 필요하다는 것을 알게 되었다.
해결방법
다음과 같이 WebMvcTest 시 JpaMetamodelMappingContext를 MockBean으로 등록하고 테스트해보자 정상적으로 성공하는 것을 확인할 수 있었다.
외에 다른 방법도 있다.
@EnableJpaAuditing 애너테이션을 Application클래스가 아닌, 따로 Configuration 클래스를 생성하여 달아주는 것이다.
WebMvcTest는 Configuration 클래스를 빈으로 등록하지 않기 때문에 이렇게 하면 컨트롤러 테스트 시에 JpaMetamodelMappingContext를 직접 등록하지 않아주어도 된다.
나는 전자로 하면 종종 까먹고 에러 화면을 마주할 거 같으므로 후자를 택했다.
알게된 점
WebMvcTest는 MVC에 필요한 빈만 등록한다.
모든 테스트는 Application 클래스를 빈으로 등록한다.
Application 클래스에서 Jpa 관련 애너테이션을 달면 모든 테스트에서 Jpa 관련 빈을 필요로 하게 되어 WebMvcTest에서 문제가 생길 수 있다.
'Dev' 카테고리의 다른 글
Java11의 CharSequence에서 isEmpty() 사용 시 컴파일 에러 발생 (0) | 2024.09.02 |
---|---|
Amazon S3에 이미지 파일 업로드 (0) | 2024.07.24 |
비즈니스 로직을 어디에 위치시킬 것인가? 2024.8.10 수정 (0) | 2024.06.11 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!