Junit 테스트 시 주로 @WebMvcTest와 @SpringBootTest 를 사용
1. Mock
실제 객체를 만들어서 테스트하기 어려운 경우에 가짜 객체를 만들어서 테스트함
2. MockMvc
MVC에 관련된 Mock 가짜 객체를 의미
- 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고, 테스트용 MVC 환경을 만들어서 요청 및 전송, 응답 기능을 제공해주는 객체
- 대부분 애플리케이션 기능을 테스트하기 위해서 MockMvc 객체를 만들어서 테스트
- @Autowired로 주입받아서 사용
3. @WebMvcTest
- MockMvc 객체를 빈으로 등록해서 @Autowired로 MockMvc 주입 가능
- Web Layer 관련 빈들만 등록하기 때문에, @Component로 등록한 빈은 @MockBean으로 등록해야함.
- 컨트롤러 테스트, 단위 테스트 시 많이 사용됨
장점
- Web Layer 관련 빈만 로드하기때문에 속도가 @SpringBootTest보다 빠름
- 통합테스트에서 테스트가 어려운 작은 단위 테스트들을 @WebMvcTest로 진행 가능
단점
- Mock 객체를 사용하기때문에 실제 환경에서는 다른 오류가 발생할 수 있음
4. @SpringBootTest
- MockMvc 객체를 빈으로 등록하지 않기때문에 @AutoConfigureMockMvc를 이용해 빈으로 등록해야함
- 프로젝트에 있는 스프링 빈을 모두 등록해서 테스트에 필요한 의존성을 추가해줌
- 단위 테스트와 같은 기능 테스트가 아닌, 통합테스트 시 많이 사용됨 ( 전체적인 프로그램 작동이 제대로 이루어지는지 검증 )
장점
- 프로젝트에 있는 모든 스프링 빈을 등록하므로 테스트에 필요한 객체를 주입받아서 쉽게 사용 가능
- 실제 환경과 가장 유사하게 테스트 가능
단점
- 모든 스프링 빈을 등록할 때 프로젝트의 전체 컨텍스트를 로드해서 빈을 주입하기 때문에 속도 느림
- 테스트 단위가 크기때문에 디버깅이 어려울 수 있음
5. Mock 주입 시 차이점
1) @WebMvcTest
@WebMvcTest
class SpringBootTest {
@Autowired
MockMvc mockMvc; // 주입 O
}
2) @SpringBootTest
@SpringBootTest
class SpringBootTest {
@Autowired
MockMvc mockMvc; // 주입 X
}
@SpringBootTest 는 MockMvc를 빈으로 등록시키지 않음
@SpringBootTest
@AutoConfigureMockMvc
class SpringBootTest {
@Autowired
MockMvc mockMvc; // 주입 O
}
@AutoConfigureMockMvc 를 이용해 MockMvc 를 빈으로 등록하는 과정 추가
6. Bean 등록 시 범위 차이점
1) @WebMvcTest
@WebMvcTest
class SpringBootTest {
@Autowired
MockMvc mockMvc; // 주입 O
@Autowired
UserController userController; // 주입 O
@Autowired
UserRepository userRepository; // 주입 X
@Autowired
UserService userService; // 주입 X
}
@WebMvcTest에서는 Web Layer 관련 빈들만 등록함
Web Layer에 속하는 항목들
Controller, Security, Filter, Interceptor, request/response Handling
그래서 컨트롤러는 주입 되지만, @Component로 등록된 Repository와 Service는 주입이 안되는 것
@WebMvcTest
class SpringBootTest {
@Autowired
MockMvc mockMvc; // 주입 O
@Autowired
UserController userController; // 주입 O
@MockBean
UserRepository userRepository; // 주입 O
@MockBean
UserService userService; // 주입 O
}
@MockBean을 이용해서 Repository와 Service를 Mock 객체에 빈으로 등록해주면 됨
2) @SpringBootTest
@SpringBootTest
class SpringBootTest {
@Autowired
MockMvc mockMvc; // 주입 O
@Autowired
UserController userController; // 주입 O
@Autowired
UserRepository userRepository; // 주입 O
@Autowired
UserService userService; // 주입 O
}
Controller, Repository, Service 다 @Autowired 주입 가능