본문 바로가기

Web Sever 개발과 CS 기초/스프링

Spring MVC 테스트 코드 작성 법

MockMVC이란

MockMVC는 spring MVC 테스트 시 가짜 객체를 만들어, 서버를 직접 실행 시키지 않아도, Spring MVC동작을 재현해주는 클래스이다.

MockMVC 객체를 통해, 클라이언트의 HTTP Request를 가정하고, 그에 따른, 서버의 HTTP Response를 테스트할 수 있다.

MockMVC 테스트 예시

아래의 /api/message URI를 GET하면 ok상태 코드와 hello JSON메세지를 돌려주는 간단한 Controller를 테스트 해보겠다.

@RestController
public class GetController {
  
    @GetMapping("/api/message")
    public ResponseEntity getFromMessage() {
        String jsonMessage = "{\"message\":\"hello\"}";
        return ResponseEntity.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .body(jsonMessage);
    }
}

<테스트 코드>

@SpringBootTest
class GetControllerTest {

    @Autowired
    private GetController getController;
    private MockMvc mockMvc;
    ObjectMapper objectMapper;

    @BeforeEach
    void init() {
        mockMvc = MockMvcBuilders.standaloneSetup(getController).build();
        objectMapper = new ObjectMapper();
    }

    @Test
    void getFromMessage() throws Exception {
        //given
        String jsonMessage = "{\"message\":\"hello\"}";

        //when
        var request = MockMvcRequestBuilders
            .get("/api/message");

        //then
        mockMvc
            //perfrom()에 들어올 Request를 가정한다.
            .perform(request)
            //perform()에서 가정한 Request에 대한
            //Response를 andExpect()에서 예측하고 테스트한다.
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andExpect(MockMvcResultMatchers.content().json(jsonMessage))
            .andExpect(MockMvcResultMatchers.header().string("Content-Type", "application/json"))
            //andDo() 실행 결과 값을 출력한다.
            .andDo(MockMvcResultHandlers.print());
    }

 

GET이외에 다른 메소드를 테스트 할 때는 get(”/api/message”) 대신에 아래와 같이 다른 메소드를 넣어준다.

var request = MockMvcRequestBuilders
            .post("/api/message");
var request = MockMvcRequestBuilders
            .delete("/api/message");

MockMvc의 핵심 기능은 세 가지이다.

  • perform() - 해당 컨트롤러에 요청하는 가짜 Request를 설정한다.
  • andExpect() - 가짜 Requets에 대한 Response 예측을 작성하고 평가한다.
  • andDo() - 실행 결과 값을 출력한다.

이제, 핵심 기능 중에서 perform() 요청 메소드와 andExpect()검증 메소드를 구체적으로 설정하는 방법을 알아보자.

MockMvc Request 가정하기

위 그림 예시 같은 Request Message를 가정한다.

  • param / params : 쿼리 스트링 설정
  • cookie : 쿠키 설정
  • requestAttr : 요청 스코프 객체 설정
  • sessionAttr : 세션 스코프 객체 설정
  • content : 요청 본문 설정
  • header / headers : 요청 헤더 설정
  • contentType : 본문 타입 설정
@Test
public void testController() throws Exception{
	
    mockMvc.perforem(get("/api/test"))
    	.param("key", "value")
        .cookie("쿠키 값")
        .header("헤더 값:)
        .contentType(MediaType.APPLICATION.JSON)
        .content("{\"message\":\"json\"}");
}

MockMvc Response Message 가정하고 테스트하기

 

위 그림 예시의 Response Message를 설정하고 검증 받는다.

  • status : 상태 코드 검증
  • header : 응답 header 검증
  • content : 응답 본문 검증
  • cookie : 쿠키 상태 검증
  • view : 컨트롤러가 반환한 뷰 이름 검증
  • redirectedUrl(Pattern) : 리다이렉트 대상의 경로 검증
  • model : 스프링 MVC 모델 상태 검증
  • request : 세션 스코프, 비동기 처리, 요청 스코프 상태 검증
  • forwardedUrl : 이동대상의 경로 검증
@Test
public void testController() throws Exception{
	mockMvc.perform(request)
        .andExpect(status().isOk()) // Response status가 isOk인지 검증한다.
        .andExpect(content().string("expect 값"));

Reference

https://velog.io/@jkijki12/Spring-MockMvc

https://velog.io/@geesuee/Spring-Spring-Boot-MockMvc