728x90
반응형
REST Docs 관련 테스트 코드 에러
에러 로그
java.lang.IllegalArgumentException: urlTemplate not found. If you are using MockMvc did you use RestDocumentationRequestBuilders to build the request?
at org.springframework.util.Assert.notNull(Assert.java:172)
at org.springframework.restdocs.request.PathParametersSnippet.extractUrlTemplate(PathParametersSnippet.java:126)
at org.springframework.restdocs.request.PathParametersSnippet.extractActualParameters(PathParametersSnippet.java:113)
at org.springframework.restdocs.request.AbstractParametersSnippet.verifyParameterDescriptors(AbstractParametersSnippet.java:89)
at org.springframework.restdocs.request.AbstractParametersSnippet.createModel(AbstractParametersSnippet.java:74)
at org.springframework.restdocs.request.PathParametersSnippet.createModel(PathParametersSnippet.java:98)
at com.epages.restdocs.apispec.DescriptorValidator$PathParametersSnippetWrapper.validate(DescriptorValidator.kt:168)
at com.epages.restdocs.apispec.DescriptorValidator.validateIfDescriptorsPresent(DescriptorValidator.kt:111)
at com.epages.restdocs.apispec.DescriptorValidator.validatePresentParameters(DescriptorValidator.kt:40)
at com.epages.restdocs.apispec.ResourceSnippet.document(ResourceSnippet.kt:30)
at org.springframework.restdocs.generate.RestDocumentationGenerator.handle(RestDocumentationGenerator.java:191)
at org.springframework.restdocs.mockmvc.RestDocumentationResultHandler.handle(RestDocumentationResultHandler.java:52)
at org.springframework.test.web.servlet.MockMvc$1.andDo(MockMvc.java:219)
at dev.backend.wakuwaku.domain.member.controller.MemberControllerTest.update(MemberControllerTest.java:122)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
에러 코드와 내용
회원 정보 업데이트 테스트 메소드 update()는 특정 회원의 정보를 업데이트하는 테스트 코드
@Test
@DisplayName("회원 정보 업데이트 테스트")
void update() throws Exception {
// given
MemberUpdateRequest updateRequest = new MemberUpdateRequest("newNickname", "http://example.com/new-profile.jpg", "1991-01-01");
given(memberService.update(ArgumentMatchers.eq(1L), ArgumentMatchers.any(MemberUpdateRequest.class))).willReturn(1L);
// when & then
mockMvc.perform(put(BASE_URL + "/{id}", 1L)
.contentType(MediaType.APPLICATION_JSON)
.content("{ \"nickname\": \"newNickname\", \"profileImageUrl\": \"http://example.com/new-profile.jpg\", \"birthday\": \"1991-01-01\" }"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(1L))
.andDo(MockMvcRestDocumentationWrapper.document("update-member",
resource(ResourceSnippetParameters.builder()
.tag("Member")
.description("회원 정보를 업데이트합니다.")
.pathParameters(parameterWithName("id").description("회원 ID"))
.requestFields(
fieldWithPath("nickname").type(JsonFieldType.STRING).description("새로운 닉네임"),
fieldWithPath("profileImageUrl").type(JsonFieldType.STRING).description("새로운 프로필 이미지 URL"),
fieldWithPath("birthday").type(JsonFieldType.STRING).description("새로운 생일")
)
.responseFields(
fieldWithPath("id").type(JsonFieldType.NUMBER).description("회원 ID")
).build()
)
));
then(memberService).should().update(ArgumentMatchers.eq(1L), ArgumentMatchers.any(MemberUpdateRequest.class));
}
- given
- MemberUpdateRequest -> 새로운 닉네임, 프로필 이미지 URL, 생일 정보 등의 DTO
- memberService.update 메소드가 호출될 때 (1L) id와 MemberUpdateRequest 객체를 인자로 받아서, 1L을 반환하도록 설정한다.
- when & then
- RestDocumentationRequestBuilders.put(BASE_URL + "/{id}", 1L)을 사용하여 PUT 요청
- 요청 본문에는 JSON 형태로 새로운 MemberUpdateRequest DTO 정보를 담음
- 기대하는 응답 상태는 200 OK
- 응답 본문에 회원 ID가 1L인지 확인
- MockMvcRestDocumentationWrapper.document를 사용하여 API 문서화
위 로직으로 테스트와 검증을 하고, REST Docs 문서화를 하려는데... 자꾸 에러가 났다.
java.lang.IllegalArgumentException: urlTemplate not found. If you are using MockMvc did you use RestDocumentationRequestBuilders to build the request?
오류 내용만 봐도 뭔가 MockMvcRestDocumentationWrapper.document 식별할 수 없다는 느낌이었다.
알고보니...
// when & then
mockMvc.perform(put(BASE_URL + "/{id}", 1L)
.contentType(MediaType.APPLICATION_JSON)
.content("{ \"nickname\": \"newNickname\", \"profileImageUrl\": \"http://example.com/new-profile.jpg\", \"birthday\": \"1991-01-01\" }"))
위 코드에서 perform(put .... 으로 보내주는데, Spring REST Docs가 정확히 인식하지 못한다는 이유였다.
즉, MockMvcRestDocumentationWrapper.document 메소드가 요청 URL을 식별할 수 없다는 이유
PUT 부분을 REST Docs가 식별할 수 있게 RestDocumentationRequestBuilders.put으로 수정해줘야 함.
RestDocumentationRequestBuilders.put
해결...
728x90
반응형