Spring boot - WebFlux - WebTestClient - 将响应转换为 responseEntity

Posted

技术标签:

【中文标题】Spring boot - WebFlux - WebTestClient - 将响应转换为 responseEntity【英文标题】:Spring boot - WebFlux - WebTestClient - convert response to responseEntity 【发布时间】:2021-11-30 16:57:14 【问题描述】:

我有一个响应式控制器,它返回:

@ResponseBody
@GetMapping("/data")
public Mono<ResponseEntity<Data>> getData() 
  //service call which returns Mono<Data> dataMono
  Mono<ResponseEntity<Data>> responseEntityMono = dataMono
          .map(data -> ResponseEntity.ok(data))
          .doFinally(signalType -> );

  return responseEntityMono;

我正在使用WebTestClient 测试此端点,但我想提取黄瓜的响应实体以进一步验证。

我试过了:

@Autowired private WebTestClient webTestClient;

public ResponseEntity get() 
  EntityExchangeResult < ResponseEntity > response = webTestClient.get()
    .uri(uriBuilder ->
      uriBuilder
      .path(VISUALIZATION_URL)
      .build())
    .header("Accepts", "application/json")
    .exchange()
    .expectStatus().isOk()
    .expectHeader().contentType(MediaType.APPLICATION_JSON_VALUE)
    .expectBody(ResponseEntity.class)
    .returnResult();
  return response.getResponseBody();

但我收到错误消息。我可以通过以下方式获取 JSON:

public String get() 
  BodyContentSpec bodyContentSpec = webTestClient.get()
    .uri(uriBuilder ->
      uriBuilder
      .path(URL)
      .build())
    .header("Accepts", "application/json")
    .exchange()
    .expectStatus().isOk()
    .expectHeader().contentType(MediaType.APPLICATION_JSON_VALUE)
    .expectBody();
  return new String(bodyContentSpec.returnResult().getResponseBody());

但我正在尝试查看是否可以获取整个 ResponseEntity,以便我可以验证标头、缓存标头和正文。

【问题讨论】:

请不要写but I am getting error这种说法一点帮助都没有。请更新您的问题。 【参考方案1】:

您将永远无法在测试中获得ResponseEntity。从exchange() 返回的WebTestClient.ResponseSpec 是检查控制器答案的唯一方法。 ResponseEntity 只是您在方法中返回的对象,但是一旦 Jackson 序列化它,它就会转换为常规 HTTP 响应(在您的情况下,他的正文中包含 JSON 和常规 HTTP 标头)。

【讨论】:

以上是关于Spring boot - WebFlux - WebTestClient - 将响应转换为 responseEntity的主要内容,如果未能解决你的问题,请参考以下文章

1 个 Spring Boot 应用程序中的 Spring mvc 和 webflux

服务器使用 Spring Boot 和 WebFlux 发送事件

原始性能表格 - Spring Boot 2 Webflux vs. Spring Boot 1

Spring Boot Webflux/Netty - 检测关闭的连接

如何在 Spring boot 2 + Webflux + Thymeleaf 中配置 i18n?

spring-boot-webflux 中未使用配置的 ObjectMapper