Spring

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

latissimus 2022. 11. 9. 18:49

향로님의 프리렉 책을 따라 학습하던 도중, 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

진홍님 블로그 - 완전깔끔