이번 강의에서는 DTO 응답 스펙이 바뀌면 테스트 코드도 반드시 함께 수정해야 한다는 점을 다뤘다.
테스트는 단순히 “돌아가나 확인”이 아니라, API 응답 스펙(계약)을 고정하는 역할을 한다.
6강에서 PostDto, PostCommentDto에 작성자 정보가 추가되었다.
authorIdauthorNamepostIdDTO가 바뀌면, 컨트롤러 응답 JSON 구조도 바뀐다.
따라서 기존 테스트는 “예전 JSON”을 기대하고 있어서 실패할 수 있다.
테스트 코드에서 새 필드를 검증하는 assert가 추가되었다.
예를 들어 글 단건 조회/작성 테스트에서:
.andExpect(jsonPath("$.data.authorId").value(post.getAuthor().getId()))
.andExpect(jsonPath("$.data.authorName").value(post.getAuthor().getNickname()))
리스트 응답 테스트에서:
.andExpect(jsonPath("$[%d].authorId".formatted(i)).value(post.getAuthor().getId()))
.andExpect(jsonPath("$[%d].authorName".formatted(i)).value(post.getAuthor().getNickname()))
.andExpect(...)가 뭐야?MockMvc로 요청을 보내면, 결과(Response)에 대해 기대값을 검증(assert) 할 수 있다.
mockMvc.perform(get("/api/v1/posts/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data.title").value("제목"));
perform() : 요청 실행andExpect() : 결과가 기대한 값과 같은지 확인(틀리면 테스트 실패)jsonPath("...")가 뭐야?응답이 JSON일 때, JSON 안에서 특정 위치 값을 뽑는 문법이다.
| 표현 | 의미 |
|---|---|
$ | JSON의 루트(root) |
$.data | 루트 아래 data |
$.data.title | data 안의 title |
$[0] | 배열의 0번째 요소 |
$[0].title | 배열 0번째의 title |
{
"resultCode": "200-1",
"data": {
"id": 1,
"title": "제목"
}
}
$.data.id → 1$.data.title → "제목".value(...)는 뭐야?jsonPath()로 뽑은 값이 이 값이 맞는지 확인하는 부분
.andExpect(jsonPath("$.data.title").value("제목"))
즉, “응답 JSON에서 $.data.title 값이 제목 이어야 한다” 뜻.
Matchers.startsWith(...)는 뭐야?날짜/시간 문자열은 초/나노초까지 다르면 테스트가 자주 깨진다.
그래서 “앞부분만 맞으면 통과” 하게 만드는 패턴을 쓰기도 한다.
.andExpect(jsonPath("$.data.createDate")
.value(Matchers.startsWith(post.getCreateDate().toString().substring(0, 20))))
startsWith("2026-01-07T06:16:") 이런 식으로 앞부분만 비교📌 즉, “createDate가 완전히 똑같진 않아도, 앞부분이 같으면 OK” 전략