Today I Learned
Spring Boot MockMvc
#MockMvc란?
MockMvc는 Spring MVC 애플리케이션의 Controller 계층을 실제 서버를 띄우지 않고 테스트할 수 있도록 도와주는 테스트 도구이다.
내부적으로 DispatcherServlet을 모킹(mocking)하여 HTTP 요청과 응답을 시뮬레이션한다.
#MockMvc의 사용 목적
- 빠른 테스트: 서버 구동 없이 Controller 로직 검증 가능
- HTTP 요청 시뮬레이션: GET, POST, PUT, DELETE 등 다양한 요청 테스트
- 응답 검증: 상태 코드, 헤더, JSON 응답 값까지 세밀하게 검증 가능
#MockMvc 주요 기능
1. HTTP 요청 시뮬레이션
- `perform()` 메서드를 사용해 GET, POST, PUT, DELETE, PATCH 등 다양한 HTTP 요청을 가상 실행
- 요청 시 쿼리 파라미터, PathVariable, RequestBody 모두 설정 가능
mockMvc.perform(post("/api/tasks/{taskId}/comments", 1)
.contentType(MediaType.APPLICATION_JSON)
.content("{\"content\":\"댓글 내용\"}"));
2. 응답 상태 코드 검증
- `andExpect(status().isOk())` 처럼 HTTP 상태 코드 검증 가능
- `isCreated()` → 201, `isBadRequest()` → 400, `isNotFound()` → 404, `isInternalServerError()` → 500
3. 응답 본문 검증
- `jsonPath()`를 사용해 JSON 응답의 특정 필드 값 검증
- `content().string()`으로 문자열 응답 검증
.andExpect(jsonPath("$.id").value(1))
.andExpect(jsonPath("$.message").value("댓글이 생성되었습니다."))
.andExpect(content().string(containsString("성공")));
4. 응답 헤더 검증
- `header().string("헤더명", "값")`으로 특정 헤더 값 검증
.andExpect(header().string("Content-Type", "application/json"));
5. 요청/응답 로깅
- `andDo(print())`로 요청과 응답 전체를 콘솔에 출력
- 디버깅 시 유용
6. 체이닝(Chaining)
- `perform()` → `andExpect()` → `andDo()` 순서로 메서드 체이닝 가능
- 가독성이 높고, 테스트 흐름이 한눈에 보임
7. 파라미터/쿠키/세션 설정
- `.param("key", "value")` → 쿼리 파라미터 설정
- `.cookie(new Cookie("name", "value"))` → 쿠키 설정
- `.sessionAttr("name", value)` → 세션 값 설정
#코드 예시
@SpringBootTest
@AutoConfigureMockMvc
class MemberControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void 회원_조회_테스트() throws Exception {
mockMvc.perform(get("/members/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(1))
.andDo(print());
}
}
마치며
MockMvc는 Spring MVC 애플리케이션에서 Controller 테스트의 표준 도구라 할 수 있다.
실제 서버를 띄우지 않아도 HTTP 요청과 응답을 정밀하게 검증할 수 있어, 개발 속도와 테스트 품질을 동시에 높여준다.
다만, 실제 운영 환경과 100% 동일하지 않기 때문에, 통합 테스트와 병행하는 것이 안정적인 품질 확보에 도움이 된다.