如何用WireMock对硬编码外部API进行集成测试?
解决WireMock拦截硬编码API的方案
核心逻辑
项目B硬编码了https://store-platform-dev/items,直接用WireMock的代理配置无效——因为请求会直接发向真实域名,根本不会经过WireMock。必须先把请求的目标域名导向WireMock服务,再由WireMock处理存根响应。
具体实现步骤
1. 本地Hosts映射(最简本地测试方案)
修改系统hosts文件,把硬编码域名指向WireMock所在的本地地址:
- Windows路径:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS路径:
/etc/hosts
添加一行配置:
127.0.0.1 store-platform-dev
这样项目B发起的请求会被强制转到本地WireMock服务。
2. 启动WireMock并开启HTTPS
因为目标API是HTTPS协议,WireMock需要配置HTTPS端口,可直接用自带的自签名证书启动:
java -jar wiremock-jre8-standalone.jar --https-port 443 --print-all-network-traffic
如果443端口被占用,可替换为8443等其他端口,后续需同步调整相关配置。
3. 编写WireMock存根规则
现在请求会流向WireMock,直接编写匹配/items路径及对应请求头的存根即可,无需代理相关配置:
stubFor(get(urlEqualTo("/items")) .withHeader("X-Your-Request-Header", equalTo("Expected-Value")) // 匹配项目B带的请求头 .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody("{\"id\":1,\"name\":\"Mocked-Item\"}")));
4. 处理SSL证书验证问题(可选)
由于用了自签名证书,项目B可能抛出SSL信任错误,可二选一解决:
- 将WireMock的自签名证书导入项目B的信任存储
- 测试环境临时禁用SSL证书验证(仅用于测试,生产绝对禁止)
替代方案:CI环境用反向代理
如果本地Hosts映射不适用(比如CI/CD流水线),可使用Nginx做反向代理,将store-platform-dev的请求转发到WireMock:
server { listen 443 ssl; server_name store-platform-dev; ssl_certificate /path/to/wiremock/cert.pem; ssl_certificate_key /path/to/wiremock/key.pem; location /items { proxy_pass http://your-wiremock-server:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
同时在CI环境配置DNS解析,把store-platform-dev指向Nginx服务器即可。
内容的提问来源于stack exchange,提问作者harshini reddy
相关产品推荐
相关产品推荐

