[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;

...

@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());
}

좋은 웹페이지 즐겨찾기