실제 객체와 비슷하지만 테스트에 필요한 기능만 가지는 가짜 객체를 만들어서 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스를 의미합니다.
여기서 저는 @RestControllerAdvice 적용한 부분을 테스트 해보기 위해 해당 테스트 코드를 작성했습니다.
mockMvc 생성
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(memberController)
.setControllerAdvice(GlobalExceptionHandler.class)
.build();
생성된 객체를 통해 GET/POST/DELETE/PUT 이 가능하다.
MvcResult result = mockMvc.perform(
post("/member/register") // 없는 요청
.content("{}")
.contentType(MediaType.APPLICATION_JSON_VALUE))
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().is5xxServerError())
.andReturn();
perform()
요청을 전송하는 역할을 합니다. 결과로 ResultActions 객체를 받으며, ResultActions 객체는 리턴 값을 검증하고 확인할 수 있는 andExcpect() 메소드를 제공해줍니다.
params()
파라미터를 넣을 수 있습니다. 여기에는 사용하지 않았습니다.
andDo()
요청 및 응답 메세지를 전부 확인 가능합니다.
andExpect()
응답 검증하는 역할을 합니다.
status()
isOk() : 200
isNotFound() : 404
isMethodNotAllowed() : 405
isInternalServerError() : 500
view()
ex) view().name("blog") : 리턴하는 뷰 이름이 blog인가?
많은 응답에 대한 검증들을 제공합니다.
추가로 Assertions 처럼 Test시 예측한 결과와 다르면 같은 빨간 x로고가 뜹니다.
@Test
void 예외문구_처리() throws Exception {
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(memberController)
.setControllerAdvice(GlobalExceptionHandler.class)
.build();
MvcResult result = mockMvc.perform(
post("/member/register") // 없는 요청
.content("{}")
.contentType(MediaType.APPLICATION_JSON_VALUE))
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().is5xxServerError())
.andReturn();
String content = result.getResponse().getContentAsString();
System.out.println(content);
}