У меня есть @ControllerAdvice
аннотированный класс, который обрабатывает BadRequestException extends RuntimeException
исключение.
Теперь предположим, что у меня есть конечная точка:
@PostMapping(value = "/createAccount")
public ResponseEntity<CreateAccountResponse> createAccount(@RequestBody @Valid CreateAccountRequest createAccountRequest) {...}
В случае нежелательного сценария конечная точка выдает BadRequestException
(с HTTP-статусом 400), что создает объект ошибки JSON следующим образом:
{
"errorCode": 123,
"errorMessage: "Failure reason"
}
Есть ли способ документировать подобные случаи, используя Spring REST Docs?
Это пример моего подхода:
@Test
public void createAccountFailExample() {
RestDocumentationResultHandler docs = document("create-acc-fail-example",
responseFields(
fieldWithPath("errorCode").type("Integer").description("Error code"),
fieldWithPath("errorMessage").type("String").description("Error message")
)
);
org.assertj.core.api.Assertions.assertThatThrownBy(() -> this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
.contextPath("/account")
.contentType(TestUtil.APPLICATION_JSON_UTF8)
.content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("nameTest", "surnameTest"))))
.andExpect(status().isBadRequest())
.andDo(docs)).hasCause(new BadRequestException(ServiceError.SOME_FAIL_REASON));
}
В этом случае тест проходит успешно, но файлы документации (.adoc) не создаются.
Когда я пытаюсь что-то вроде этого:
ResultActions resultActions = this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
.contextPath("/account")
.contentType(TestUtil.APPLICATION_JSON_UTF8)
.content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("testName", "testSurname"))))
.andExpect(status().isBadRequest())
.andDo(docs);
тест не пройден, потому что NestedServletException
был вызван BadRequestException
, и снова документация не создана.