모르지 않다는 것은 아는것과 다르다.

Junit

MockMvc

채마스 2022. 2. 27. 01:41

MockMvc 란?

  • 애플리케이션을 배포하지 않고도, 서버의 MVC 동작을 테스트 할 수 있는 라이브러리이다.
  • 실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 가짜 객체를 만들어서 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스를 의미한다.
  • 주로 Controller 레이어 단위테스트에 많이 사용된다.
  • MockMvc는 크게 세가지 동작을 갖는다.
    • perform
      • 가상의 request(요청)를 처리한다.
      • request(요청)은 MockHttpServletRequestBuilder를 통해서 생성된다.
    • except
      • 가상의 response에 대해서 검증한다.
      • 검증항목은 아래와 같다.
        • hadler()
        • status()
        • model()
        • view()
        • 위 메서드들은 ResultMacher를 반환한다.
    • do
      • 테스트 과정에서 직접 처리할 일을 작성한다.
      • 실제 동작은 ResultHandler를 사용한다.
  • 코드 예시
//when & then
mockMvc.perform(put("/contents/1")
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaType.APPLICATION_JSON)
                    .characterEncoding("UTF-8")
                    .content(
                            "{ \"name\" : \"user1\", \"content\": \"content2\"}"
                    ))
        .andExpect(status().isOk())
        .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
        .andExpect(jsonPath("$.data").isArray())
        .andExpect(jsonPath("$.data[0].name").value("user1"))
        .andExpect(jsonPath("$.data[0].title").value("title1"))
        .andExpect(jsonPath("$.code").value(ErrorCode.OK.getCode()))
        .andExpect(jsonPath("$.message").value(ErrorCode.OK.getMessage()));




요청 만들기

  • 요청은 MockMvcRequestBuilders 의 메소드인 get, post, put, delete fileUpload 등을 이용해서 MockHttpServletBuilder 객체를 생성한다.
  • MockHttpServletBuilder 는 ServletRequest 를 구성하기에 필요한 다양한 메서드를 제공한다.
    • param / params : 요청 파라미터를 설정한다.
    • header / headers : 요청 헤더를 설정한다.
    • cookie : 쿠키를 설정한다.
    • requestAttr : request scope에 attribute 를 설정한다.
    • flashAttr : flash scope에 attribute 를 설정한다.
    • sessionAttr : session scope에 attribute 를 설정한다.
    • locale : Locale 정보를 설정한다.
    • characterEncoding : 요청의 인코딩 정보를 설정한다.
    • contentType : Enum인 MediaType 으로 요청의 컨텐트 타입을 설정한다.
    • file : fileUpload로 ServletRequestBuilder 를 생성한 경우 업로드 파일을 지정한다.
  • 위 메소드를 MockMvc의 perform 메서드에 파라미터로 설정해준다.
  • 예시는 아래와 같다.
MockHttpServletRequestBuilder builder = 
                    get("/add")
                    .param("현욱", 4).param("개발자", 6)
                    .cookie(new Cookie("name", "채현욱"))
                    .locale(Locale.KOREA);
mock.perform(builder);




검증하기

  • perform 의 결과로 RequestActions 가 반환되고, 이 객체의 andExpect 메소드에 RequltMatcher 를 넘겨줘서 검증한다.
  • ResultMatcher 는 아래의 MockMvcResultMatcher 가 가지고 있는 static 메소드를 통해서 검증할 수 있다.
    • handler : 요청에 매핑된 컨트롤러를 검증한다.
    • header : 응답 헤더의 값을 검증한다.
    • cookie : 응답을 통해 전달된 쿠키를 검증한다.
    • content : 응답의 본문 내용을 검증한다.
    • view : Controller의 handler method가 반환된 view의 이름을 검증한다.
    • model : model에 담긴 attribute 값을 검증한다.
    • flash : flash scope에 담긴 attribute 값을 검증한다.
    • forwardedUrl / forwardedUrlPattern : forward 로 이동하는 대상의 경로를 검증한다.
    • redirectedUrl / redirectedUrlPattern : redirect로 이동하는 경우 대상의 경로를 검증한다.
    • status : Http 상태 코드를 이용해서 검증한다.
  • 코드 예시
mock.perform(builder)
    .andExpect(handler().hadlerType(testController.class))
    .andExpect(handler().methodName("testMethod"))
    .andExpect(forwardedUrl("test"))
    .andExpect(header().stringValues("Content-Language", "en"))
    .andExpect(view().name("test"))
    .andExpect(status().is(200));




실행하기

  • 검증할때와 마찬가지로 ResultActions의 andDo 메소드를 이용한다.
  • 파라미터로 ResultHander 를 전달하는데 이것들은 MockMvcResultHandlers에 static 메소드로 정의되어 있다.
    • print : 실행 결과를 표준 출력을 이용해서 출력한다.
  • 코드 예시
mock.perform(builder)
    .andExpect(status().is(200))
    .andDo(print());




REFERENCES

'Junit' 카테고리의 다른 글

Service 단위테스트  (0) 2022.02.27
Repository 단위테스트  (0) 2022.02.27
Mockito  (0) 2022.02.27
Junit5 애노테이션 비교  (0) 2022.02.27
# Junit 5 기본 애노테이션  (0) 2022.02.27