BackEnd/JPA

[JPA] JPA metamodel must not be empty!

샤아이인 2022. 7. 28.

 

1. 문제 상황

테스트코드를 작성하던 도중, Controller계층에 @WebMvcTest Slice Test를 하나 추가했더니, JPA metamodel must not be empty! 에러가 발생했다.

 

TestDouble에 필요한 부분들은 전부 Stub을 만들어 줬다고 생각되는데, 어디서 에러가 발생하는지 찾기 어려웠다.

 

알고보니 객체를 생성하고, 영속화 할때 자동으로 생성시각이 기록되도록 Auditing 기능을 사용하고 있었는데, 이게 문제였다.

 

2. 원인

우선 나의 메인 메서드라 할 수 있는 IssueTrackerApplicaion.java는 다음과 같다.

@EnableJpaAuditing
@SpringBootApplication
public class IssueTrackerApplication {

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

}

Spring 컨테이너를 요구하는 테스트는 가장 기본이 되는 XXXApplication 클래스가 항상 로딩된다.

@EnableJpaAuditing이 해당 클래스에 등록되어 있어서 모든 테스트들이 항상 JPA 관련 Bean들을 필요로 하고 있는 상황이였다.

 

통합 테스트야 JPA를 포함한 모든 Bean들을 주입받기 때문에 에러가 발생하지 않았지만,

@WebMvcTest같은 슬라이스 테스트는 JPA 관련 Bean들을 로드하지 않기 때문에 에러가 발생했다.

 

3. 해결

3-1) Configuration 분리하기

따로 config라는 별도의 패키지에 Auditing관련 Configuration Class를 만들어 주었다.

이 방식이 가장 사용하기 편리한 방식인 것 같다.

 

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration {
}

 

3-2) MockBean

@WebMvcTest(대상Controller.java)
@MockBean(JpaMetamodelMappingContext.class)

이 방식은 Controller에 대한 모든 Slice 테스트에 추가해줘야 하기 때문에 불편한 방식인것 같다.

그냥 1번 방식처럼 따로 설정해주는것이 편하다.

댓글