You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring WebClient模拟服务器测试:等效RestTemplate MockRestServiceServer实现

测试封装Spring WebClient的服务:模拟服务器与响应

实现方案

要实现和MockRestServiceServer等效的WebClient测试,有两种常用方案,分别贴合Spring生态和提供更细致的请求控制:

方案一:使用Spring WebTestClient(推荐)

WebTestClient可以直接绑定到你的WebClient实例,拦截请求并验证预期,步骤如下:

// 绑定WebClient到WebTestClient
WebTestClient webTestClient = WebTestClient.bindToWebClient(listener.getWebClient()).build();

// 设置请求预期并模拟响应
webTestClient.post()
    .uri("http://localhost:8080/tise")
    .exchange()
    .expectStatus().isBadRequest(); // 对应原代码的withBadRequest()

如果需要限制调用次数,可以在执行服务方法后,结合断言确认请求只被触发一次。

方案二:使用OkHttp MockWebServer

这个方案可以更细致地控制请求的各个细节(请求头、请求体、响应内容等),步骤如下:

  1. 先添加测试依赖(Maven示例):
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>mockwebserver</artifactId>
    <scope>test</scope>
</dependency>
  1. 编写测试代码:
// 启动模拟服务器
MockWebServer mockServer = new MockWebServer();
mockServer.start();

// 调整WebClient的基础地址指向模拟服务器
String serverUrl = mockServer.url("/").toString();
WebClient testWebClient = WebClient.builder().baseUrl(serverUrl).build();
listener = new listener(testWebClient, conf);

// 设置模拟响应(对应原代码的withBadRequest())
mockServer.enqueue(new MockResponse().setResponseCode(400));

// 执行你的服务中调用WebClient的方法
listener.yourWebClientCallingMethod();

// 验证请求是否符合预期
RecordedRequest request = mockServer.takeRequest();
assertEquals("POST", request.getMethod());
assertEquals("/tise", request.getPath());
assertEquals(1, mockServer.getRequestCount()); // 验证只调用一次

// 关闭服务器
mockServer.shutdown();

关键说明

  • WebTestClient无需修改WebClient的地址,适合快速验证响应状态和简单请求规则。
  • MockWebServer需要调整WebClient的baseUrl,能满足更复杂的请求验证场景,比如检查请求体内容、请求头参数等。

内容的提问来源于stack exchange,提问作者Ares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:31:10