스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 읽다가 궁금해서 포스팅한 내용입니다.
개요
@WebMvcTest
를 사용한 테스트 코드가 있었다.
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
...
}
이 테스트 코드를 돌리니 IllegalArgumentException: At least one JPA metamodel must be present!라는 에러가 발생했다.
책에는 단순히 아래와 같이 설명돼 있었다..
@WebMvcTest는 @EnableJpaAuditing로 인해 발생한다.
@EnableJpaAuditing를 사용하기 위해선 최소 하나의 @Entity 클래스가 필요합니다.
@WebMvcTest이다 보니 당연히 없습니다.
@WebMvcTest
이다 보니 당연히 없습니다. ????
난 테스트 코드가 처음이라 이 말이 당최 이해가 안 가서 찾아보았다.
원인
@WebMvcTest
는 3-tier Layered에서 Presend Layer만 스캔한다.
즉 @Respository
, @Service
, @Component
는 빈으로 등록하지 않는다.

테스트 코드를 돌릴 때 ~~Application.class들이 돌면서 작동한다고 한다.
이때 Application.class에 있는 @EnableJpaAuditin
어노테이션으로 인해 JPA에 관련된 빈을 찾지 못하기 때문에 생기는 에러라고 한다.
@EnableJpaAuditing //**
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
해결
Application의 @EnableJpaAuditing
을 제거하고, 이것을 관리하는 설정클래스를 따로 분리한다.
@SpringBootApplication
public class Application {
public staticvoid main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Configuration
@EnableJpaAuditing // JPA Auditing 활성화
public class JpaConfig {
}
JPA 기능까지 한번에 테스트할 때는 @SpringBootTest와 TestRestTemplate를 사용하면 된다.
참고