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

Pact消费者侧契约测试抛出PactMismatchesException如何解决

问题排查与解决方案

核心错误原因

你遇到的报错是Pact消费者测试的典型配置错误,问题出在两点:

  • 测试代码直接请求了真实服务地址https://api.ipify.org,而Pact消费者测试运行时会自动启动本地Mock Provider服务,所有测试请求必须发送到这个Mock服务地址,否则Pact无法捕获请求做匹配,就会报「请求未收到」的错误
  • 你把查询参数format=json直接拼接在了path配置项里,Pact默认会把路径和查询参数分开做匹配,直接拼在路径里会导致匹配规则不生效

修复步骤

步骤1:调整Pact定义的路径、查询参数配置

将拼接在路径里的查询参数拆分出来,用Pact专门的查询参数配置方法声明:

@Pact(consumer = "Consumer")
RequestResponsePact apiIsReachablePact(PactDslWithProvider builder) {
    return builder.given("api is reachable")
            .uponReceiving("load api")
            .method("GET")
            .path("/") // 仅保留基础路径
            .queryParameter("format", "json") // 单独声明查询参数
            .willRespondWith()
            .status(200)
            .headers(headers())
            .body(newJsonBody(object -> {
                object.stringType("ip", "XYZ");
            }).build())
            .toPact();
}

步骤2:修改测试代码,请求Pact启动的Mock服务

@PactTestFor注解运行时会自动注入Mock服务实例,直接用Mock服务的地址构造请求即可,不要使用真实服务地址:

@Test
@PactTestFor(pactMethod = "apiIsReachablePact")
public void apiIsReachable(MockServer mockServer) throws IOException {
    // 拼接Pact Mock服务地址和请求路径
    String requestUrl = mockServer.getUrl() + "/?format=json";
    HttpUriRequest request = new HttpGet(requestUrl);

    //When
    HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);

    //Then
    assertEquals(httpResponse.getStatusLine().getStatusCode(), HttpStatus.SC_OK);
}

补充说明

如果你的业务代码中封装了接口调用的基础地址,测试时需要将基础地址配置替换为Pact Mock服务的地址,不要在代码中硬编码真实服务地址。

内容的提问来源于stack exchange,提问作者nomeal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:06:05