1) TDD 란?
2) 단위테스트란?
1) 단위테스트는 개발단계 초기에 문제를 발견하게 도와줌
2) 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지확인할 수 있음
1) Application 클래스 작성하기
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2) web 패키지안에 HelloController 생성
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
3) 테스트 패키지 밑에 WEB 패키지 밑에 HelloControllerTest 클래스 생성
@RunWith(SpringRunner.class)
@MockBean(JpaMetamodelMappingContext.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void hello가_리턴된다() throws Exception {
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
}
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
@Autowired
private MockMvc mvc
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello))
@MockBean(JpaMetamodelMappingContext.class)
Spring 컨테이너를 요구하는 테스트는 가장 기본이되는 --Application 클래스가 항상 로드되는데, @EnableJpaAuditing이 해당 클래스에 등록되어 있어 모든 테스트들이 항상 JPA 관련 Bean들을 필요로 하는 것이였다.
물론, @SprignBootTest를 사용할 때는 전체 컨텍스트를 로드하고 JPA를 포함한 모든 Bean을 주입받기 때문에 에러가 발생하지 않지만, @WebMvcTest같은 슬라이스 테스트는 JPA 관련 Bean들을 로드하지 않기 때문에 에러가 발생하였다.
해결방법
1) @MockBean(JpaMetamodelMappingContext.class) 추가
2) JpaAuditingConfiguration 클래스를 생성하여 @Configuration 어노테이션을 추가하여 분리
출처: https://jeongkyun-it.tistory.com/199
나는 여기서 1번 방법을 추가해서 test 클래스에 해당 어노테이션을 추가해줘서 에러를 해결했다.
사실 최상위 클래스인 Application에 @EnableJpaAuditing 코드를 지워주면 해결되지만 JPA에 대한 빈때문에 그냥 냅뒀다.