본문 바로가기
Spring

[스프링 부트 + JPA] 잘 되던 테스트가 갑자기 안되는 경우 JPA metamodel must not be empty!

by latissimus 2022. 11. 9.

향로님의 프리렉 책을 따라 학습하던 도중, JPA Auditing을 추가한 다음 전체 테스트를 돌려봤더니, MockMvc를 이용한 테스트가 빨간줄이 뜬다.

 

오류

원인

원인

원인은 위와 같이 Application 클래스에 @SpringBotoApplication과 함께 @EnableJpaAuditing을 붙인 것이다. Spring 컨테이너를 요구하는 테스트를 실행하면, 자동으로 기본이 되는 Application 클래스를 로딩한다. jpa 다른 슬라이스 테스트(참고 : 테코블 파피님)들까지 JPA 관련 빈을 요구하게 되면서 문제가 생긴다.

 

해결 1

실력이 미천하여 이해를 할 수 없었다. 갑자기 왜 jpa metamodel이 비었다는 것인지.. 구글과 블로거분들이 해결해줬다.

 

예시 1

Application에 있던 문제가 되는 @EnableJpaAuditing 어노테이션을 떼어버렸다.

 

아래와 같이 설정 클래스를 따로 만들어 분리하면 된다. 

 

예시 2

Spring Boot Reference Documention의 User Configuration and Slicing를 보면 아래와 같이 batch의 예시를 동일하게 보여준다.

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableBatchProcessing
public class MyApplication {

    // ...

}

문서에서는 다음과 같이 말한다. 이 클래스는 테스트를 위한 source configuration이기때문에, 어떤 slice 테스트든 SpringBatch를 실행하려고 시도할 것이다. 해당 configuration을 application의 같은 level에다 분리된 @Configuration 클래스를 만들어서 옮기기를 권장한다.

 

마찬가지로 설정파일로 분리한다.

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
@EnableBatchProcessing
public class MyBatchConfiguration {

    // ...

}

 

해결 2

슬라이스 테스트하는 클래스에 @MockBean을 추가해주면 된다. 다양한 슬라이스 테스트마다 일일히 해당 어노테이션을 추가하느니 설정파일을 하나 만드는게 나아보인다.

 

 

느낀점

이해를 해보려고 정리를 시도했는데, 스프링에 대해 모르는게 참 많다는 걸 느낀다. 자바의 어노테이션은 상속이 안될텐데, 스프링의 어노테이션 자체의 동작방법이 무엇인지도 의문이고... 관련된 내용을 파보고 싶은데, 내 수준에 맞는 효율적인 공부에 집중하기 위해 우선은 보류이다.

 

 

 

References

Spring Boot JPA metamodel must not be empty! when trying to run JUnit / Integration Tests

Spring Boot Reference Documention

테코블 파피님 : slice test

진홍님 블로그 - 완전깔끔

댓글