본문 바로가기

트러블 슈팅

[Junit5] JPA metamodel must not be empty!


Spring-Boot 환경에서 Junit5를 사용한 Controller 단위 테스트를 진행하는 도중, 다음과 같은 에러가 발생하였다.

Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty!
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JPA metamodel must not be empty!

 

원인

JPA에서 Entity의 생성, 수정에 관한 LocalDateTime을 자동으로 설정해주는 Auditing 기능을 사용하기 위해 @EnableJpaAuditing 어노테이션을 사용하였고 해당 어노테이션을 MainApplication에 등록한 것이 원인이였다.

Spring Context를 사용하는 테스트에서는 가장 기본이 되는 MainApplication 클래스가 항상 등록이 된다. 해당 클래스가 등록이 되는 과정에서 @EnableJpaAuditing이 같이 등록되어 있어서 테스트를 진행하는데 JPA 관련 Bean들이 필요했고, 해당 Bean들이 등록되어 있지 않아 오류가 발생한 것이였다.

 

해결 방법

@EnableJpaAuditing 어노테이션을 MainApplication에 등록하는 것이 아닌 별도의 설정 파일을 만들어서 등록한다.

 

[기존 코드]

@EnableJpaAuditing
@SpringBootApplication
public class MainApplication {

	public static void main(String[] args) {
		SpringApplication.run(MainApplication.class, args);
	}
}

 

[수정 코드]

@SpringBootApplication
public class MainApplication {

	public static void main(String[] args) {
		SpringApplication.run(MainApplication.class, args);
	}
}
@Configuration
@EnableJpaAuditing
public class JpaConfig {
}

 


위와 같이 코드를 수정하면, 테스트는 정상적으로 수행된다.