Rest docs와 PathVariable 문제점 발견
문제점
java.lang.IllegalArgumentException: urlTemplate not found. If you are using MockMvc did you use RestDocumentationRequestBuilders to build the request?
문제가 발생한 코드
@DisplayName("상세 게시글 페이지에서 좋아요(△, ▽) 버튼을 누를 수 있다.")
@WithAuthUser(email = "test123@naver.com", role = "ROLE_USER")
@Test
void putFavorite() throws Exception {
final int boardNumber = 1;
mockMvc.perform(put("/api/v1/board/{boardNumber}/favorite", boardNumber))
.andExpect(status().isOk())
.andDo(document("board-favorite-button-click",
preprocessResponse(prettyPrint()),
pathParameters(
parameterWithName("boardNumber").description("Board Id")
)
));
}
- urlTemplate이 발견되지 않았다. MockMvc에서 preform안에 넣어줄 인자를 RestDocumentationRequestBuilders 로 요청해주지 않겠니?
- 역시 에러 로그를 보면 답이 다 나온다.!
해결책
@DisplayName("상세 게시글 페이지에서 좋아요(△, ▽) 버튼을 누를 수 있다.")
@WithAuthUser(email = "test123@naver.com", role = "ROLE_USER")
@Test
void putFavorite() throws Exception {
final int boardNumber = 1;
mockMvc.perform(RestDocumentationRequestBuilders.put("/api/v1/board/{boardNumber}/favorite", boardNumber))
.andExpect(status().isOk())
.andDo(document("board-favorite-button-click",
preprocessResponse(prettyPrint()),
pathParameters(
parameterWithName("boardNumber").description("Board Id")
)
));
}
- RestDocumentationRequestBuilders.put("/api/v1/board/{boardNumber}/favorite", boardNumber)
- 기존에 import 되어 있었던 코드는
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
- MockMvcRequestBuilders 의 static 메서드였다.
- 결국은 타고 타고 올라가면
- 아래는 RestDocumentationRequestBuilders의 상속 or 인터페이스 를 타고 올라가면 나오는 코드
public interface SmartRequestBuilder extends RequestBuilder {
/**
* Apply request post-processing. Typically, that means invoking one or more
* {@link org.springframework.test.web.servlet.request.RequestPostProcessor org.springframework.test.web.servlet.request.RequestPostProcessors}.
* @param request the request to initialize
* @return the request to use, either the one passed in or a wrapped one
*/
MockHttpServletRequest postProcessRequest(MockHttpServletRequest request);
}
- 마찬가지로 MockMvcRequestBuilders를 타고 올라가면
public interface SmartRequestBuilder extends RequestBuilder {
/**
* Apply request post-processing. Typically, that means invoking one or more
* {@link org.springframework.test.web.servlet.request.RequestPostProcessor org.springframework.test.web.servlet.request.RequestPostProcessors}.
* @param request the request to initialize
* @return the request to use, either the one passed in or a wrapped one
*/
MockHttpServletRequest postProcessRequest(MockHttpServletRequest request);
}
- 그대로 나오는 것을 확인할 수 있었다.
- 관련 문제점을 다른 블로그에서도 확인할 수 있었다.
- pathVariable 기능을 사용할 때 RestDocumentationRequestBuilders의 메서드(get(), post(), put(), patch(), delete())를 사용해야 한다고 한다.
- 아니면 위의 에러가 발생하는 것