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