실제 객체와 비슷하지만 Controller 테스트에 필요한 기능만 가지는 가짜 객체를 만들어서 애플리케이션 배포하지 않아도 스프링 MVC 패턴 및 동작을 테스트 할 수 있는 클래스이다.
단위 테스트를 위해서는 MockMvc 라는 객체가 사용된다.
MockMvc 는 테스트를 위해 브라우저나 WAS 의 동작을 똑같이 처리해 줄 수 있는 환경이라고 생각하면 된다. MockMvc 를 이용해 브라우저에서 발생하는 요청을 가상으로 만들고 Controller 가 응답하는 내용을 기반으로 검증을 수행한다.
요청은 MockMvcRequestBuilders 의 static 메소드인 get, post, put, delete 등을 이용해서 MockHttpServletRequestBuilder 객체를 생성하는 것에서 시작한다.
MockHttpServletRequestBuilder 는 ServletRequest 를 구성하기에 필요한 메소드를 제공한다.
get | 요청을 전송한다.
결과로 ResultActions 객체를 받으며, 인자로는 경로를 보내주는데 HTTP 메소드를 결정할 수 있다. (get(), post(), put(), delete()) |
param / params | 요청 파라미터를 설정한다. |
header / headers | 요청 헤더를 설정한다. |
cookie | 쿠키를 설정한다. |
contentType | Enum 인 MediaType 으로 요청의 컨텐트 타입을 설정한다. |
file | fileUpload 로 ServletRequestBuilder 를 생성한 경우 업로드 파일을 지정한다. |
private final MockMvc mvc;
mvc.perform(get("/add"))
perform 의 결과로 받은 ResultActions 객체는 andExcpect() 메소드에 RequltMatcher 를 넘겨줘서 리턴 값을 검증하고 확인할 수 있다.
handler | 요청에 매핑된 컨트롤러를 검증한다. |
header | 응답 헤더의 값을 검증한다. |
cookie | 응답을 통해 전달된 쿠키를 검증한다. |
content | 응답의 본문 내용을 검증한다. |
view | Controller 의 handler method 가 반환한 view 의 이름을 검증한다. view().name("forward:/add") : 리턴하는 뷰 이름이 add 가 맞나? |
model | model 에 담긴 attribute 값을 검증한다. |
forwardedUrl / forwardedUrlPattern | forward 로 이동하는 대상의 경로를 검증한다. |
redirectedUrl / redirectedUrlPattern | redirect 로 이동하는 대상의 경로를 검증한다. |
status | Http 상태 코드를 이용해 검증한다. isOk() : 200 isNotFound() : 404 isMethodNotAllowed() : 405 isInternalServerError() : 500 is(int status) : status 상태 코드 |
private final MockMvc mvc;
mvc.perform(get("/add"))
.andExpect(status().isOk())
.andExpect(view().name("forward:/add"))
.andExpect(forwardedUrl("/add"))
.andExpect(model().attribute("message", "어쩌고저쩌고"))
ResultActions 객체의 andDo 메소드를 이용한다. 파라미터로 ResultHandler 를 전달하는데 MockMvcResultHandlers 에 static 메소드로 정의되어있다.
실행 결과를 출력한다. 요청/응답 전체 메세지를 확인할 수 있다. |
private final MockMvc mvc;
mvc.perform(get("/add"))
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print());