如何使用 Spring REST Docs 记录 @ControllerAdvice 处理的异常
How to document @ControllerAdvice handled exception using Spring REST Docs
我有 @ControllerAdvice
注释 class,它正在处理 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
引发,并且同样没有创建文档。
我设法解决了 this answer 之后的问题。当为 MockMvc
定义异常处理程序时,我的第二种方法按预期工作。
我有 @ControllerAdvice
注释 class,它正在处理 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
引发,并且同样没有创建文档。
我设法解决了 this answer 之后的问题。当为 MockMvc
定义异常处理程序时,我的第二种方法按预期工作。