프로젝트 내부에 있는 Bean을 모두 등록하며, 실제 운영 환경에서 사용되는 클래스들을 통합해서 테스트를 진행한다.
따라서 실제 환경과 유사하게 테스트가 가능하다는 장점이 있지만, 모든 Bean을 등록하기 때문에 느리고 테스트 단위가 커서 디버깅이 까다롭다는 단점이 있다.
Controller의 역할만을 테스트하며 Web Layer에 해당하는 Bean만 빠르게 생성한다.
@Component를 등록하지 않기 때문에 필요한 Bean을 직접 채워야하지만 테스트가 훨씬 빠르다는 장점이 있다.
통합테스트에서 진행이 어려운 경우 Mock으로 테스트 가능하나 MockMvc를 사용하므로 실제 동작과 차이가 있다.
실제 객체를 만들어서 테스트하기가 어려운 경우, 가짜 객체를 만들어서 테스트하는 기술
MVC에 관련된 Mock 가짜 객체
웹 어플리케이션을 애플리케이션 서버에 배포하지 않고, 테스트용 MVC 환경을 만들어서 요청 및 전송, 응답 기능을 제공해주는 객체.
대부분 기능 테스트 위해 MockMvc 객체를 만들어서 테스트 하는데 MockMvc를 @Autowired로 주입받아서 사용가능
@SpringBootTest
@SpringBootTest
class Test{
@Autowired
MockMvc mockMvc; // 주입 X
}
------------------------------
@SpringBootTest
@AutoConfigureMockMvc
class Test{
@Autowired
MockMvc mockMvc; // 주입 O
}
주입되지 않아 오류가 발생한다.
그 이유는, @SpringBootTest는 MockMvc를 Bean으로 등록시키지 않기 때문이다.
그래서 @AutoConfigureMockMvc 어노테이션으로 선언하면 MockMvc를 Bean으로 등록해준다.
@WebMvcTest
@WebMvcTest
class Test{
@Autowired
MockMvc mockMvc; // 주입 O
}
@WebMvcTest는 MockMvc를 빈으로 등록해서 선언하면 객체가 주입된다.
@SpringBootTest
@SpringBootTest
class Test{
@Autowired
MockMvc mockMvc; // 주입 O
@Autowired
TestController testController; // 주입 O
@Autowired
TestService testService; // 주입 O
@Autowired
TestRepository testRepository; // 주입 O
}
프로젝트의 Controller, Service, Repository가 @Autowired로 다 주입된다.
@WebMvcTest
@WebMvcTest
class Test{
@Autowired
MockMvc mockMvc; // 주입 O
@Autowired
TestController testController; // 주입 O
@Autowired
TestService testService; // 주입 X
@Autowired
TestRepository testRepository; // 주입 X
----------------------------------------
@MockBean
TestService testService; // 주입 O
@MockBean
TestRepository testRepository; // 주입 O
}
Web Layer 관련 Bean들만 등록하기 때문에 Controller는 정상적으로 주입되지만,
@Component로 등록된 Service와 Repository는 주입되지 않는다.
따라서, 정상적으로 사용하기 위해서 @MockBean을 사용해 Service와 Repository를 Mock 객체에 Bean으로 등록해줘야한다.
✏️ 간단하게 사용하려면
@Mock을 사용하면 되고, 컨테이너에 올리고 싶으면@MockBean을 사용하면 된다.
✏️ Web Layer 항목들
Security, Filter, Interceptor, request/response Handling, Controller