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 - 检测关闭的连接