스프링부트 테스트관련 코드에서 테스트코드를 실행했더니 Error creating bean with name 'jpaAuditingHandler' 이와 같은 오류가 발생했다.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument
at app//org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377)
at app//org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135)
at app//org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:689)
at app//org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:513)
at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1334)
at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1164)
at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561)
at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521)
at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)
at app//org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:960)
원인이 무엇인지 확인해보니까
1. 프로젝트 내에서 Spring 컨테이너를 활용하는 테스트를 진행할 때, 가장 기본이 되는 Application 클래스가 항상 로드가 된다.
2. Application 클래스에 @EnableJpaAuditing 어노테이션이 추가되어 있어, 모든 테스트가 JPA 관련 Bean들을 필요로 하는 상태가 되버린 것이다.
3. 통합 테스트의 경우, 전체 컨텍스트를 로드하고 JPA를 포함한 모든 Bean들을 주입받기 때문에 문제가 발생하지 않습니다.
4. 그러나 @WebMvcTest를 사용하는 단위 테스트는 JPA 관련 Bean을 전혀 로드하지 않기 때문에, 여기서 에러가 발생합니다.
이를 해결하기 위해서는 아래와같은 어노테이션을 달아주는 간단한 방법이 있지만 이 방법으로는 Bean을 목 객체로 대체하여 사용하는 방법이기때문에 다른방법으로 문제를 해결해보겠습니다.
@MockBean(JpaMetamodelMappingContext.class)
두 번째 방법으로는 @Configuration 분리하는 방법입니다.
@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration {
}
이런식으로 @EnableJpaAuditing 관련 클래스를 따로 빼서 작성해두면 단위테스트 때 마다@MockBean(JpaMetamodelMappingContext.class) 이런 어노테이션을 안달아도 해결이 된다 !
'Spring' 카테고리의 다른 글
FCM 푸시 알림, SQS + Lambda로 리팩토링 (3) | 2024.09.02 |
---|---|
정적 팩토리 메서드 패턴의 중요성 (0) | 2024.07.17 |
멀티모듈 서비스 레이어 분리 (0) | 2024.02.01 |
ApplicationTests > contextLoads() FAILED 에러 해결 (1) | 2024.02.01 |
메세지 큐를 활용한 트랜잭션 관리 - 기술적 챌린지 (1) | 2023.08.22 |