如何在
Exception
测试中验证实际的 spring-webflux
?
以下内容在旧的 spring-web
环境中有效,但是迁移到 netty 和 spring-webflux,MvcResult
无法再解决(NullPointerException
):
@SpringBootTest
@AutoConfigureWebTestClient
public class ApiTest {
@Test
public void test() throws Exception {
webTestClient.get()
.uri("/api?test=123")
.exchange()
.expectStatus().isBadRequest()
.expectBody().consumeWith(rsp -> {
//throws NPE
Exception ex = ((MvcResult) rsp.getMockServerResult()).getResolvedException();
assertTrue(ex instanceof ResponseStatusException);
});
}
}
@RestController
public class ApiController {
@PostMapping("/api")
public String test(@RequestParam String test) {
if (test.matches("[0-9]+"))
throw new ResponseStatusException(HttpStatus.BadRequest, "Prohibited characters");
}
}
我怎样才能仍然验证真正的异常类?
WebTestClient
的主要目的是使用流畅的API测试端点以验证响应。没有发生神奇的反序列化或错误处理,但您可以访问原始响应(状态、标头、正文)。
在您的示例中,您不会获得
MvcResult
或 ResponseStatusException
,但您可以使用 rsp.getResponseBody()
访问原始主体,如下所示
{
"timestamp": "2022-05-17T17:57:07.041+00:00",
"path": "/api",
"status": 400,
"error": "Bad Request",
"requestId": "4fa648d"
}
您可以使用
expectBody().consumeWith(rsp -> { ... })
来访问请求和响应,或使用 expectBody(String.class).value(body -> { ... })
来获取正文。作为替代方案,使用一些流畅的 API 来验证结果 JSON .expectBody().json(<expected json>)
或 .expectBody().jsonPath()
仅检查特定字段。
此外,您仍然可以使用
.expectBody(Response.class).value(body -> {...})
显式反序列化 body。