MockMVC란?

Spring 3.2부터 Spring MVC를 모킹하여 웹 애플리케이션 테스트를 지원하는 라이브러리로, Web Application을 배포하지 않고 Spring MVC의 동작을 재현하여 테스트할 수 있다.

MockMVC를 사용하면 실제 서버를 실행하지 않고도 컨트롤러 로직을 테스트할 수 있다.

Gradle 의존성 추가

testImplementation 'org.springframework:spring-test:5.3.8'

MockMVC 초기화 방법

1️⃣ Web Application Context를 사용하여 초기화

MockMvcBuilders.webAppContextSetup(wac).build();를 사용하여 MockMvc를 초기화할 수 있다.

MockMvc mockMvc;

@BeforeEach  
void setUp(WebApplicationContext wac) {  
    mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); 
}

2️⃣ 특정 컨트롤러만 테스트할 경우

MockMvcBuilders.standaloneSetup()을 사용하여 개별 컨트롤러만 초기화할 수 있다.

MockMvc mockMvc;

@BeforeEach 
void setup() { 
    mockMvc = MockMvcBuilders.standaloneSetup(new ApiController()).build(); 
}

API 호출 테스트

MockMVC의 perform() API를 사용하면 실제 컨트롤러를 호출하는 것과 동일한 테스트가 가능하다.

public ResultActions perform(RequestBuilder requestBuilder) throws Exception

3️⃣ MockMvcRequestBuilders를 사용한 API 요청

public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars){...}

public static MockHttpServletRequestBuilder post(String urlTemplate, Object... uriVars){...}

public static MockHttpServletRequestBuilder put(String urlTemplate, Object... uriVars){...}

public static MockHttpServletRequestBuilder delete(String urlTemplate, Object... uriVars){...}

응답 검증 (Assertion)

4️⃣ MockMvcResultMatchers를 활용한 검증

메서드명 검증 대상
request session scope, request scope, async
handler  
model spring MVC model status
view controller가 반환한 view 명
flash  
forwardedUrl 이동 대상의 경로
redirectedUrl 리다이렉트된 URL 확인
status HTTP 상태 코드 검증
header 응답 헤더 확인
content 응답 본문 검증
jsonPath JSON 응답 데이터 확인

5️⃣ JSON 응답 데이터 검증 예제

Hamcrest를 활용하여 JSON 값을 검증할 수 있다.

@Test  
void TestTestController()  {  
	mockMvc.perform(MockMvcRequestBuilders.get("/test"))  
            .andExpect(status().isOk())  
            .andExpect(jsonPath("$.error").value("false"))  
            .andExpect(jsonPath("$.count").value(matchesRegex("\d+")))
            .andExpect(jsonPath("$.datalist").isArray())  
            .andExpect(jsonPath("$.datalist", hasSize(greaterThan(0))))
            .andExpect(jsonPath("$.datalist[*].sequence", everyItem(matchesRegex("\d+"))))  
            .andExpect(jsonPath("$.datalist[*].processDateTime", everyItem(matchesRegex("\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}")))) // 예: "2024-07-30 15:00:00"  
            .andExpect(jsonPath("$.datalist[*].userName", everyItem(matchesRegex("^[\p{L} ]+$")))); // 이름이 문자와 공백만 포함하도록 정규 표현식 설정
}

6️⃣ JSON Path 오류 해결을 위한 의존성 추가

implementation 'com.jayway.jsonpath:json-path:2.7.0'

연결문서

댓글남기기