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
相关产品推荐
相关产品推荐

