Spring Boot WebFlux中WebTestClient如何将响应转换为ResponseEntity
问题根因
你之前的写法存在两个核心问题:
- 控制器返回的
Mono<ResponseEntity<Data>>是Spring WebFlux的内部响应封装对象,网络传输时只会输出状态码、响应头、响应体三个部分,并不会把整个ResponseEntity对象序列化后传给客户端。因此你直接调用expectBody(ResponseEntity.class)尝试把响应体反序列化为ResponseEntity对象必然报错,因为响应体本身就是你的业务实体Data的JSON结构,和ResponseEntity的类结构完全不匹配。 - 请求头名称拼写错误:标准的内容协商请求头是
Accept而非Accepts,拼写错误可能导致服务端返回非预期的内容类型。
正确实现
WebTestClient 本身已经提供了直接获取完整ResponseEntity的能力,不需要手动反序列化,有两种写法可选:
写法1:使用内置toEntity方法(最简便)
import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.web.reactive.server.WebTestClient; @Autowired private WebTestClient webTestClient; public ResponseEntity<Data> get() { return webTestClient.get() .uri(uriBuilder -> uriBuilder .path(VISUALIZATION_URL) .build()) .accept(MediaType.APPLICATION_JSON) .exchange() .expectBody(Data.class) // 指定响应体对应的业务实体类型 .toEntity() // 直接封装为包含全量响应元数据的ResponseEntity对象 .block(); // 同步等待异步结果返回 }
写法2:手动从EntityExchangeResult拼装
如果你需要对中间结果做更多自定义处理,可以从返回结果中手动拼装ResponseEntity:
import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.web.reactive.server.EntityExchangeResult; import org.springframework.test.web.reactive.server.WebTestClient; @Autowired private WebTestClient webTestClient; public ResponseEntity<Data> get() { EntityExchangeResult<Data> result = webTestClient.get() .uri(uriBuilder -> uriBuilder .path(VISUALIZATION_URL) .build()) .accept(MediaType.APPLICATION_JSON) .exchange() .expectBody(Data.class) .returnResult(); return ResponseEntity .status(result.getStatus()) .headers(result.getResponseHeaders()) .body(result.getResponseBody()); }
校验说明
拿到ResponseEntity<Data>之后,你可以直接在Cucumber校验步骤中读取:
- 响应状态:
responseEntity.getStatusCode() - 所有响应头:
responseEntity.getHeaders(),包含缓存头、内容类型等所有元数据 - 响应体内容:
responseEntity.getBody(),已经自动反序列化为你的业务实体Data对象,不需要手动解析JSON
内容的提问来源于stack exchange,提问作者plzdontkillme
相关产品推荐
相关产品推荐

