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 {
}
위와 같이 코드를 수정하면, 테스트는 정상적으로 수행된다.
'트러블 슈팅' 카테고리의 다른 글
Kotest + 생성자 Bean 주입 (0) | 2023.05.27 |
---|---|
Kotlin + Spring DTO에서 NotNull 변수의 null Validation (1) | 2023.05.18 |
[Junit5] org.mockito.exceptions.misusing.MissingMethodInvocationException (0) | 2022.11.21 |
[Spring] Spring Security + Junit5 (0) | 2022.11.15 |
[JPA] UnexpectedRollbackException (0) | 2022.11.04 |