Spring - MockMvc

Spring MVC 테스트 프레임워크

Posted by Yan on November 13, 2023

MockMvc란?

  • Spring MVC 테스트 프레임워크
  • MockMvc는 웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스
  • MockMvc를 사용하면, API를 실제로 호출하지 않고도 API의 동작을 시뮬레이션하여 API의 동작을 검증할 수 있다.

MockMvc 사용하기

  1. MockMvc를 생성하여 요청에 대한 정보를 입력한다.
  2. 요청에 대한 응답값을 Expect를 이용하여 테스트하고, Expect가 모두 통과하면 테스트 통과, Expect가 1개라도 실패하면 테스트 실패다.

1. MockMvc 초기화하기

MockMvc는 Spring MVC의 구성 요소를 사용하여 동작하므로, 애플리케이션의 ApplicationContext를 사용하여 MockMvc를 초기화해야 한다.

1
2
3
4
5
6
7
8
9
10
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    // ...
}

2. API 사용하기

MockMvc를 사용하여 API를 호출하려면, perform() 메서드를 사용한다.

  • MockHttpServletRequestBuilder 객체를 인자로 받는다.
  • MockHttpServletRequestBuilder: API 호출을 나타냄. HTTP 메서드, URL, 요청 본문, 요청 헤더 등을 설정할 수 있다.
1
2
3
4
5
6
7
@Test
public void testMyApi() throws Exception {
    mockMvc.perform(get("/myApi"))  // myApi url에 GET요청 수행
        .andExpect(status().isOk()) // 반환된 HTTP STATUS CD가 200인지 판단
        .andExpect(content().contentType(MediaType.APPLICATION_JSON)) // 반환된 콘텐츠 타입이 JSON인지 판단
        .andExpect(jsonPath("$.data").exists());  // 반환된 JSON 데이터에 .data필드가 있는지 검증
}

3. 요청 본문 설정하기

  • MockMvc를 사용하여 POST 또는 PUT 요청을 수행할 때는 요청 본문을 설정해야 한다.
  • 요청 본문은 content() 메서드를 사용하여 설정할 수 있다.
1
2
3
4
5
String requestBody = "{\"name\":\"myName\",\"age\":15}"; // JSON 문자열을 전달
mockMvc.perform(post("/myApi") // POST 요청
    .contentType(MediaType.APPLICATION_JSON) // contentType() 메서드를 사용하여 요청 본문의 콘텐츠 타입을 설정
    .content(requestBody))
    .andExpect(status().isOk());

4. 요청 헤더 설정하기

요청 헤더는 header() 메서드를 사용하여 설정한다.

1
2
3
mockMvc.perform(get("/myApi")
    .header("Authorization", "Bearer " + accessToken))
    .andExpect(status().isOk());

5. 응답 검증하기

MockMvc를 사용하여 API를 호출하면, 반환된 응답을 andExpect() 메서드를 사용하여 검증할 수 있다.

1
2
3
4
5
mockMvc.perform(get("/myApi"))
    .andExpect(status().isOk())
    .andExpect(content().contentType(MediaType.APPLICATION_JSON))
    .andExpect(jsonPath("$.data.name").value("myName"))
    .andExpect(jsonPath("$.data.age").value(15));
검증 메소드 종류
  • status : 상태 코드 검증
  • header : 응답 header 검증
  • content : 응답 본문 검증
  • cookie : 쿠키 상태 검증
  • view : 컨트롤러가 반환한 뷰 이름 검증
  • redirectedUrl(Pattern) : 리다이렉트 대상의 경로 검증
  • model : 스프링 MVC 모델 상태 검증
  • request : 세션 스코프, 비동기 처리, 요청 스코프 상태 검증
  • forwardedUrl : 이동대상의 경로 검증
응답 상태 코드 종류
  • isOk() : 상태 코드가 200인지 확인
  • isNotFount() : 404인지 확인
  • isMethodNotAllowed() : 405인지 확인
  • isInternalServerError() : 500인지 확인
  • is(int status) : 임의로 지정한 상태 코드인지 확인
reference

Java Spring _ MockMvc를 사용한 API 테스트
[Spring] MockMvc 공부하자!!