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