Error Document/Spring

Spring Boot jUnit Test : JPA metamodel must not be empty! 에러 해결 방법

JeongKyun 2022. 7. 18.
반응형

서론

Controller 테스트코드 작성 중 다음과 같은 에러를 만났다. 해당 에러를 어떻게 해결하는지 원인과 해결방법 2가지에 대해서 정리해보도록 하겠다.

 


 

에러 발생 원인

Controller에 관련된 @MockBean 처리는 다 해준 것 같았는데 참 이상했다. 찾아보니 원인은 JPA를 사용하며 공통 & 자동으로 관리해주는 Auditing 클래스를 만들어놓았는데 이것을 @SpringBootApplication에 등록해놓은 것이 문제였다.

 

Spring 컨테이너를 요구하는 테스트는 가장 기본이되는 --Application 클래스가 항상 로드되는데, @EnableJpaAuditing이 해당 클래스에 등록되어 있어 모든 테스트들이 항상 JPA 관련 Bean들을 필요로 하는 것이였다.

 

물론, @SprignBootTest를 사용할 때는 전체 컨텍스트를 로드하고 JPA를 포함한 모든 Bean을 주입받기 때문에 에러가 발생하지 않지만, @WebMvcTest같은 슬라이스 테스트는 JPA 관련 Bean들을 로드하지 않기 때문에 에러가 발생하였다.

 


 

에러 해결 방법 (2가지)

1. @Configuration 분리

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration {
}

JpaAuditingConfiguration 클래스를 생성하여 @Configuration 어노테이션을 추가하여 분리해준다.

 

2. @MockBean 추가

@MockBean(JpaMetamodelMappingContext.class)

컨트롤러 테스트 클래스에 해당 어노테이션을 추가해준다.

 

예시

@WebMvcTest(xxController.class)
@MockBean(JpaMetamodelMappingContext.class)
@AutoConfigureWebMvc
public class xxControllerApiTest {	
}

 

두 가지 방법중 골라 사용하면 될 것 같다. 필자같은경우는 테스트 클래스마다 @MockBean처리하는 것 보단 1번 방식인 따로 외부 Configuration 클래스로 분리하여 처리하였다.

댓글

💲 많이 본 글