에러 배경 : Controller 테스트 코드 작성 중 다음과 같은 에러를 만남.
Controller
@RestController
public class HelloController {
@GetMapping("/helloStart")
public String helloStart(){
return "hello spring";
}
}
Test
@WebMvcTest
class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void helloStart() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/helloStart"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string("hello spring"));
}
}
Console
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JPA metamodel must not be empty!
에러 원인
: JPA를 사용하며 공통 & 자동으로 관리해주는 Auditing 클래스를 만들어 놓았는데 이것을 @SpringBootApplication에 등록해놓은것이 문제
Spring 컨테이너를 요구하는 테스트는 가장 기본이 되는 Application 클래스가 항상 로드되며 @EnableJpaAuditing이 해당 클래스에 등록되어 있어 모든 테스트들이 항상 JPA 관련 Bean들이 필요하게 됨
But,
를 사용할 때는 전체 Context를 로드하고 JPA를 포함한 모든 Bean을 주입받기 때문에 에러가 발생하지 않음
@WebMvcTest같은 슬라이스 테스트는 JPA관련 Bean들을 로드하지 않기 때문에 에러 발생
1. @Configuration 분리하여 별도의 JPAconfig 클래스와 @EnableJpaAuditing 선언
2. @MockBean 추가
@WebMvcTest(HelloController.class)
@MockBean(JpaMetamodelMappingContext.class)
class HelloControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void helloStart() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/helloStart"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string("hello spring"));
}
}
결과
MockHttpServletRequest:
HTTP Method = GET
Request URI = /helloStart
Parameters = {}
Headers = []
Body = null
Session Attrs = {}
Handler:
Type = com.test.jpa.jpaProj.controller.HelloController
Method = com.test.jpa.jpaProj.controller.HelloController#helloStart()
Async:
Async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
Attributes = null
MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"12"]
Content type = text/plain;charset=UTF-8
Body = hello spring
Forwarded URL = null
Redirected URL = null
Cookies = []
'Spring > 99.Error' 카테고리의 다른 글
JDK 11에 java.xml.bind 관련 에러 발생 (0) | 2023.11.24 |
---|---|
[Spring Boot] ASM ClassReader failed to parse class file 에러 (0) | 2023.09.20 |
[Spring Boot] Intelliji와 Gradle 세팅시 Unable to find method 에러 해결 (0) | 2023.09.20 |
Spring Boot) could not initialize proxy - no Session 에러 해결 (0) | 2023.05.11 |
@Builder 어노테이션 사용시 필드 초기화 에러 해결 방법 (0) | 2023.05.06 |