如何用Java代码触发调用并验证Docker部署的WireMock Service B收到请求?
用Java操作Docker部署的WireMock完成测试方案
完全可以通过Java代码实现你的需求,核心思路是:利用WireMock的远程访问能力,先触发调用1启动Service A的流程,再通过WireMock的管理接口或官方客户端验证调用2的请求是否被接收。以下是具体实现步骤和代码示例:
一、提前准备WireMock映射配置
在你挂载的./wiremock/service-b/mappings/目录下,创建调用1的Stub配置文件(比如trigger-call1.json),让WireMock能响应Service B发起的调用1请求,从而触发Service A:
{ "request": { "method": "POST", "url": "/api/call1" }, "response": { "status": 200, "body": "triggered" } }
这个配置会让WireMock在收到POST /api/call1请求时返回200响应,触发Service A后续执行到调用2的逻辑。
二、Java代码实现流程
方式1:直接调用WireMock HTTP接口(无额外依赖)
这种方式不需要引入WireMock客户端依赖,直接用Java自带的HTTP工具或Spring RestTemplate操作:
import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; public class ServiceATest { private static final String WIREMOCK_BASE_URL = "http://localhost:8081"; private final RestTemplate restTemplate = new RestTemplate(); private final ObjectMapper objectMapper = new ObjectMapper(); public static void main(String[] args) throws Exception { ServiceATest test = new ServiceATest(); // 1. 触发调用1:模拟Service B向Service A发起请求 test.triggerCall1(); // 等待Service A处理完成(根据实际业务调整时长,也可用轮询替代) Thread.sleep(5000); // 2. 验证WireMock是否收到调用2 boolean isCall2Received = test.verifyCall2(); System.out.println("调用2是否被WireMock接收:" + isCall2Received); } private void triggerCall1() { String call1Url = WIREMOCK_BASE_URL + "/api/call1"; String response = restTemplate.postForObject(call1Url, null, String.class); System.out.println("调用1触发响应:" + response); } private boolean verifyCall2() throws Exception { String adminRequestsUrl = WIREMOCK_BASE_URL + "/__admin/requests"; JsonNode allRequests = restTemplate.getForObject(adminRequestsUrl, JsonNode.class); // 筛选符合调用2特征的请求(根据实际请求的method和url调整) List<JsonNode> matchedRequests = allRequests.get("requests").findValues("request") .stream() .map(reqJson -> { try { return objectMapper.readTree(reqJson.asText()); } catch (Exception e) { return null; } }) .filter(req -> req != null) .filter(req -> "POST".equals(req.get("method").asText()) && "/api/call2".equals(req.get("url").asText())) .toList(); return !matchedRequests.isEmpty(); } }
方式2:使用WireMock官方Java客户端(更简洁)
如果项目中可以引入WireMock依赖,推荐用官方客户端,语法更直观:
第一步:添加Maven依赖
<dependency> <groupId>com.github.tomakehurst</groupId> <artifactId>wiremock-jre8</artifactId> <version>2.35.0</version> <scope>test</scope> </dependency>
第二步:编写测试代码
import com.github.tomakehurst.wiremock.client.WireMock; public class WireMockRemoteTest { public static void main(String[] args) { // 连接到Docker部署的WireMock实例 WireMock wireMock = new WireMock("localhost", 8081); // 1. 触发调用1:先确保Stub存在,再发起请求 wireMock.stubFor(WireMock.post(WireMock.urlEqualTo("/api/call1")) .willReturn(WireMock.aResponse().withStatus(200).withBody("triggered"))); wireMock.post("/api/call1"); // 等待Service A处理流程 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } // 2. 验证调用2是否被接收(如果未收到会抛出异常) wireMock.verify(WireMock.postRequestedFor(WireMock.urlEqualTo("/api/call2"))); System.out.println("调用2已被WireMock成功接收"); } }
三、关键注意事项
- 确保Docker Compose已启动WireMock服务,端口
8081正常映射到宿主机 - 等待时间需根据Service A的实际处理时长调整,也可以用轮询验证的方式替代固定休眠,提升测试稳定性
- WireMock的管理接口(
/__admin/*)默认开启,若你自定义了WireMock配置,需确保未关闭该接口 - 如果Java代码运行在Docker容器中,需将
localhost替换为Docker Compose中的服务名service-b,以保证网络连通
内容的提问来源于stack exchange,提问作者Laodao
相关产品推荐
相关产品推荐

