[JPA]EnableJpaAuditing을 Application 위에 쓰면 안되는 이유 본문

우아한테크코스 4기

[JPA]EnableJpaAuditing을 Application 위에 쓰면 안되는 이유

giron 2022. 7. 12. 15:46
728x90

@WebMvcTest를 붙이고 테스트를 돌리니 JPA metamodel must not be empty! 와 같은 에러가 발생했다.

 

이유를 찾아보니 테스트를 돌릴때는 기본적으로 XApplication이 돌면서 작동한다. 따라서 @EnableJpaAuditing을 Application위에 올리면 Jpa관련된 빈들이 올라오기를 요구한다. 이때, mockMvc를 사용한 테스트는 mvc와 관련한 빈들만 찾아서 올리므로 JPA관련 빈을 찾지 못해서 JPA metamodel must not be empty 에러가 발생한다.

 

해결방법

1. @Configuration 분리

JpaAuditingConfig.java

@EnableJpaAuditing
@Configuration
public class JpaAuditingConfig {  
}

 

2. @MockBean 추가

WebMvcTest.java

@RunWith(SpringRunner.class)
@WebMvcTest(TargetController.java)
@MockBean(JpaMetamodelMappingContext.class)

테스트 클래스에 JpaMetamodelMappingContext를 MockBean으로 추가한다.

 

2번처럼 매번 WebMvcTest마다 @MockBean을 추가해주는 방법보다는 1번 처럼 Configuration을 분리해주는 방식이 더 편한 것 같다.

 

새로운 문제점

1번 해결방법을 사용하면 모든게 해결이 될 줄알았다. 그런데 @DataJpaTest를 사용할 때 문제가 발생했다. 

 

상황은 createdAt을 가지고 있는 Article 클래스가 있다.

@DataJpa를 이용한 테스트
createdAt이 null이다.

save 후에도 null이 들어왔다.

@DataJpaTest는 JpaTest에 필요한 최소한의 빈을 불러오는데, 거기에는 @Configuration 빈이 포함되어있지 않다.

 따라서 @Configuration을 사용하여 따로 설정 파일을 만들었을 경우 아래 사진처럼 Import(JpaAuditingConfig.class)를 넣어줘야 한다.

import

 

https://xlffm3.github.io/spring%20&%20spring%20boot/JPAError/

 

Spring Boot 테스트 에러 : JPA metamodel must not be empty!

슬라이스 테스트를 진행할 때 의존성 주입에 신경쓰자.

xlffm3.github.io

 

728x90
Comments