如何在 spring-webflux WebTestClient 测试中验证异常?

问题描述 投票:0回答:1

如何在

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");
   }   
}

我怎样才能仍然验证真正的异常类?

java spring spring-boot spring-mvc spring-webflux
1个回答
1
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.