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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:30:37