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
这个方案可以更细致地控制请求的各个细节(请求头、请求体、响应内容等),步骤如下:
- 先添加测试依赖(Maven示例):
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>mockwebserver</artifactId> <scope>test</scope> </dependency>
- 编写测试代码:
// 启动模拟服务器 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
相关产品推荐
相关产品推荐

