MockMvc 테스트 하기

MinSeong Kang·2022년 6월 27일
1

spring

목록 보기
3/18

최근에 여름방학 스타트업 인턴 과제테스트를 본적이 있다. 요구 사항에 맞은 API 설계 및 구현이 해당 과제의 목적이었고, 추가로 요구 사항들이 만족하는 것을 검증할 수 있는 Test Code를 작성해야 했다. 하지만 MockMvc에 대해 잘 알지 못했기 때문에, Postman으로 테스트한 결과를 캡처해서 제출하였다. MockMvc에 대해서 알았더라면 더 좋았을 텐데라는 생각을 들어, 기록하기로 했다.

MockMvc ?

웹 애플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC 환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스

MockMvc 사용

User.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String userId;
    private String password;
}

Controller.java

@RestController
public class Controller {

    @GetMapping("/home")
    public String getHome() {
        return "request home";
    }


    @PostMapping("/home")
    public UserDto postHome(@RequestBody User user) {
        return new UserDto(user.getUserId(), user.getPassword());
    }

    @Data
    @AllArgsConstructor
    static class UserDto {
        private String id;
        private String pwd;
    }
}
  • 간단한 테스트를 하기 위해, User 도메인과 컨트롤러 클래스를 생성.
  • User 클래스와 UserDto 클래스가 동일한 멤버필드를 가지고 있지만, Dto를 사용하는 습관을 들이기 위해 UserDto 생성.
  • /home 으로 Get 요청시 Response Body에 request home이라는 문장이 출력되어야 한다.
  • /home 으로 Post 요청시 Request Body에 json 형태로 유저아이디와 비밀번호 정보가 포함되어 있어야 하며, 응답으로는 Response Body에 json 형태로 UserDto와 맞게 포함되어야 한다.

postman을 통한 검증

  • get 요청


  • post 요청

MockMvc를 통한 검증

@WebMvcTest
class ControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void getHome() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/home"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("request home"))
                .andDo(MockMvcResultHandlers.print());
    }

    @Test
    public void postHome() throws Exception {
        String requestJson = "{\"userId\":\"minnseong\", \"password\": \"1234\"}";
        String responseJson = "{\"id\":\"minnseong\",\"pwd\":\"1234\"}";

        mockMvc.perform(MockMvcRequestBuilders.post("/home")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(requestJson))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string(responseJson))
                .andDo(MockMvcResultHandlers.print());
    }
}

MockMvcResultMatchers, MockMvcResultHandlers 등 static import 시켜 코드를 간결하게 할 수 있다.

  • @WebMvcTest : 웹에서 테스트하기 힘든 컨트롤러를 테스트할 때 적합하며, MockMvc를 의존성 주입한다.
  • perform()를 통해 요청 메서드에 따라 MockMvc를 실행시킬 수 있다.
  • andExpect() : 응답을 검증하는 역할을 한다.
  • andDo(print()) : 요청/응답 메시지를 확인할 수 있다.

결과

andDo(print()) 통해 postHome 테스트의 요청/응답 메시지를 확인할 수 있다. ++ andDo(log())를 통해 테스트의 요청/응답 메시지를 디버깅 레벨로 출력할 수 있다.

MockMvc 요청 설정 메서드

param/params, cookie, requestAttr, sessionAttr, content, header/headers, contentType ...

MockMvc 검증 메서드

status, header, content, cookie, view, redirectedUrl, model, request, forwardedUrl ...


참고 자료

https://velog.io/@jkijki12/Spring-MockMvc
https://www.inflearn.com/course/호돌맨-요절복통-개발쇼/lecture/111150?volume=1.00

1개의 댓글

comment-user-thumbnail
2023년 4월 8일

정말 감사합니다.. 살았어요..

답글 달기