Как задокументировать обработанное исключение @ControllerAdvice с помощью Spring REST Docs - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть @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, и снова документация не создана.

1 Ответ

0 голосов
/ 11 ноября 2018

Мне удалось решить проблему после этого ответа .Когда обработчик исключений определен для MockMvc, мой второй подход работает как ожидалось.

...