Spring Boot项目中WireMock无法Mock WebClient请求的问题求助
问题根源
你遇到的Connection refused报错由两个核心错误导致:
- 第一:你在测试类上配置了
@AutoConfigureWireMock(port = 0),代表WireMock会随机选择可用端口启动,但业务代码里硬编码了第三方服务的调用地址为http://localhost:8443,端口不匹配自然无法连接到WireMock服务。 - 第二:Stub规则的路径匹配参数填写错误,
urlPathEqualTo方法仅需要传入请求的路径部分,不需要携带域名、端口前缀,你当前填写的全量地址会导致规则匹配失败。
解决步骤
快速修复方案
直接按现有代码逻辑修改两处即可运行:
- 修改测试类上的WireMock注解,固定启动端口为8443:
把@AutoConfigureWireMock(port = 0)改为@AutoConfigureWireMock(port = 8443) - 修改
@BeforeEach里的Stub规则,匹配路径仅保留路径部分:stubFor(post(urlPathEqualTo("/my-third-party-endpoint")) .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", MediaType.APPLICATION_JSON.toString()) .withHeader("Accept", MediaType.APPLICATION_JSON.toString()) .withBody("{}")));
规范优化方案(推荐)
避免硬编码地址,后续不会出现端口冲突、环境切换等问题:
- 把第三方服务地址抽到Spring配置文件中,比如在
application.yml里添加配置:third-party: ml-service: base-url: http://localhost:8443 - 业务代码中通过注入方式获取地址,不要硬编码:
@Value("${third-party.ml-service.base-url}") private String mlServiceBaseUrl; // 创建WebClient时使用注入的地址 WebClient webClient = WebClient.create(mlServiceBaseUrl); - 测试时直接复用WireMock自动注入的环境变量
wiremock.server.port,在测试配置文件application-test.yml中覆盖配置:third-party: ml-service: base-url: http://localhost:${wiremock.server.port} - 保留前面提到的Stub路径修正即可,不需要固定WireMock端口,避免本地端口占用导致测试启动失败。
内容的提问来源于stack exchange,提问作者Mgnfcnt
相关产品推荐
相关产品推荐

