본문 바로가기

Spring

MVC 테스트

728x90

항해 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", "hope@sparta.com");
        signupRequestForm.add("admin", "false");

// when - then
        mvc.perform(post("/user/signup")
                        .params(signupRequestForm)
                )
                .andExpect(status().is3xxRedirection())
                .andExpect(view().name("redirect:/user/login"))
                .andDo(print());
    }

'Spring' 카테고리의 다른 글

JWT 방식의 정보 인증  (0) 2024.04.12
[TIL] CORS에러! 무엇인가?  (1) 2024.04.12
RESTful하다?  (0) 2024.04.12
싱글톤 패턴  (0) 2024.04.12
[TIL] 객체지향 설계 5원칙(SOLID)  (0) 2024.04.12