[TIL] 항해99 Day 31
항해 31일차 2022.02.09
MVC 테스트
Spring MVC Test
- Spring MVC 컨트롤러의 테스트를 말한다.
- 컨트롤러의 자체는 단위 테스트가 필요할 만한 비즈니스 로직이 존재하지 않기 때문에 통합 테스트의 관점으로 접근해야 한다.
- E2E로 테스트를 할 경우
- 뷰가 생성한 응답 데이터(HTML)의 유효성을 검증할 수 있으나,
- 에플리케이션이나 데이터베이스가 반드시 기동되어야 하는 등의 단점이 있다.
- Spring Test는 E2E의 단점을 해소하면서 통합한 상태의 컨트롤러 테스트를 위해 ‘MockMvc’를 제공하고 있다.
MockMvc
- Spring에서는 MockMvc를 제공해 웹 애플리케이션을 서버에 배포하지 않고 스프링 MVC의 동작을 재현할 수 있다.
- 테스트 케이스의 메서드는 DispathcherServlet에 요청할 데이터(요청경로나 요청파라미터)를 설정하고, MockMvc는 DispathcherServlet에 요청을 보낸다.
- DispathcherServlet은 요청을 받아 매핑정보를 보고 그에 맞는 컨트롤러 메서드를 호출한다.
- 테스트 케이스 메서드는 MockMvc가 반환하는 실행결과를 받아 실행 결과가 맞는지 검증한다.
테스트 코드에 @WebMvcTest를 추가해 사용할 수 있다.
예제
@WebMvcTest(
controllers = {UserController.class, ProductController.class},
excludeFilters = {
@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = WebSecurityConfig.class
)
}
)
class UserProductMvcTest {
private MockMvc mvc;
private Principal mockPrincipal;
@Autowired
private WebApplicationContext context;
@Autowired
private ObjectMapper objectMapper;
@MockBean
UserService userService;
- 뷰가 생성한 응답 데이터(HTML)의 유효성을 검증할 수 있으나,
- 에플리케이션이나 데이터베이스가 반드시 기동되어야 하는 등의 단점이 있다.
테스트 코드에 @WebMvcTest를 추가해 사용할 수 있다.
예제
@WebMvcTest(
controllers = {UserController.class, ProductController.class},
excludeFilters = {
@ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = WebSecurityConfig.class
)
}
)
class UserProductMvcTest {
private MockMvc mvc;
private Principal mockPrincipal;
@Autowired
private WebApplicationContext context;
@Autowired
private ObjectMapper objectMapper;
@MockBean
UserService userService;
...
@Test
@DisplayName("회원 가입 요청 처리")
void test2() throws Exception {
// given
MultiValueMap<String, String> signupRequestForm = new LinkedMultiValueMap<>();
signupRequestForm.add("username", "제이홉");
signupRequestForm.add("password", "hope!@#");
signupRequestForm.add("email", "[email protected]");
signupRequestForm.add("admin", "false");
// when - then
mvc.perform(post("/user/signup")
.params(signupRequestForm)
)
.andExpect(status().is3xxRedirection())
.andExpect(view().name("redirect:/user/login"))
.andDo(print());
}
Author And Source
이 문제에 관하여([TIL] 항해99 Day 31), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kyungwoon/TIL-항해99-Day-31저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)