개인 프로젝트 중에 controller를 리팩토링하고 REST API를 구현하는 작업을 하면서 MockMVC로 간편하게 controller를 테스트할 수 있다는 것을 알게되었다.
서블릿 컨테이너의 구동 없이, 시뮬레이션된 MVC 환경에 모의 HTTP 서블릿 요청을 전송하는 기능을 제공하는 유틸리티 클래스다.
쉽게 말해, 실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 "가짜 객체" 를 만들어 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스를 의미한다.
Test 클래스에 @AutoConfigureMockMvc
annotation을 선언하고 안에 MockMVC
를 주입 받으면 사용할 수 있다.
@SpringBootTest
@AutoConfigureMockMvc
class UserApiControllerTest {
@Autowired
MockMvc mockMvc;
...
}
@Before
public void setUpMockMvc() {
this.mockMvc = MockMvcBuilders.standaloneSetup(new UserApiController()).build();
}
UserApiController
만 테스트한다는 의미이다. 단위 테스트에서 자주 쓰이며, 대상 Controller를 커스텀 할 수 있다.
addFilter()
로 필터를 추가할 수 있다.
mockMvc.perform(post("/api/users"))
perform()
을 이용하여 위에서 설정한 MockMvc를 실행 가능하다.
여러가지 요청 설정도 가능하다.
param()
/ params()
: 쿼리 스트링 설정
header()
/ headers()
: 요청 헤더 설정
cookie()
: 쿠키 설정
requestAttr()
: 요청 스코프 객체 설정
sessionAttr()
: 세션 스코프 객체 설정
content()
: 요청 본문 설정
contentType()
: 본문 타입 설정
예시:
mockMvc.perform(post("/api/users")
.content(content)
.contentType(MediaType.APPLICATION_JSON))
status()
: 상태 코드 검증
header()
: 응답 header 검증
content()
: 응답 본문 검증
cookie()
: 쿠키 상태 검증
view()
: 컨트롤러가 반환한 뷰 이름 검증
redirectedUrl(Pattern)
: 리다이렉트 대상의 경로 검증
model
: 스프링 MVC 모델 상태 검증
request
: 세션 스코프, 비동기 처리, 요청 스코프 상태 검증
forwardedUrl
: 이동대상의 경로 검증
예시:
// 요청 성공
mockMvc.perform(post("/api/users")
.content(content)
.contentType(MediaType.APPLICATION_JSON)
)
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("id").value("1"))
.andExpect(jsonPath("username").value("tester"))
.andExpect(jsonPath("email").value("test@gmail.com"));
// 요청 실패
mockMvc.perform(post("/api/users")
.content(wrongContent)
.contentType(MediaType.APPLICATION_JSON)
)
.andDo(print())
.andExpect(status().is4xxClientError());
참고
status().is4xxClientError()
를 사용하면 요청 실패도 확인이 가능하다.