테스트 코드에서의 JPA Auditing 문제 (IllegalArgumentException - JPA metamodel must not be empty!)

maketheworldwise·2022년 6월 11일
0
post-custom-banner


이 글의 목적?

테스트 코드를 작성하던 중에 다음과 같은 에러가 발생했다.

Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty!
	at org.springframework.util.Assert.notEmpty(Assert.java:470)
	at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.<init>(JpaMetamodelMappingContext.java:58)
	at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:80)
	at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:44)
	at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
	... 113 more

무슨 문제고 왜 발생했을까? 🤔

문제점

이 에러는 @DataJpaTest 어노테이션을 이용하여 Repository 테스트를 하던 중에 발생했다.

이 문제는 @EnableJpaAuditing 어노테이션이 선언된 위치에서 발생한다. 더 정확히 말하자면, 스프링 컨테이너를 요구하는 테스트는 메인 클래스가 항상 로드된다는 점에서 발생하는 문제다.

즉, @EnableJpaAuditing이 메인 클래스에 등록되어있는 상태에서 테스트하면, 메인 클래스가 로드되면서 모든 테스트들이 항상 JPA 관련 빈들을 필요로하고 있는 상태가 되기 때문에 발생하는 문제다. 통합 테스트의 경우 전체 컨텍스트를 로드하기 때문에 JPA를 포함한 모든 빈들을 주입받아 에러가 발생하지 않지만, 슬라이싱 테스트의 경우 JPA 관련된 빈들을 로드하지 않는 경우가 있어 에러가 발생한다.

해결 방안

해결책은 2가지가 있다. 먼저 해당 어노테이션을 분리시키는 방법이 있다.

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}

혹은 테스트 클래스에 @MockBean으로 추가하는 방법이 있다.

@MockBean(JpaMetamodelMappingContext.class)

이 글의 레퍼런스

profile
세상을 현명하게 이끌어갈 나의 성장 일기 📓
post-custom-banner

0개의 댓글