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

如何在PACT响应JSON中回显HTTP查询参数?测试报错求助

如何用PACT在HTTP响应体中回显查询参数

需求:当发送请求/rest/contract?hash=C3459H6S时,希望PACT返回的JSON响应体包含该hash值(如{"hash": "C3459H6S"}),实现动态响应,避免同类型请求返回固定静态JSON。

错误的尝试代码

你之前参考资料编写的代码如下:

@Pact(provider = "myProvider", consumer = "myConsumer")
public RequestResponsePact getContractByHash(PactDslWithProvider builder) {
    return builder
        .uponReceiving("a request for a contract by hash")
        .path("/rest/contract")
        .query("hash=${hashPlaceholder}")
        .method("GET")
        .willRespondWith()
        .status(200)
        .headers(Map.of("Content-Type", "application/json"))
        .body("{\"hash\": \"${hashPlaceholder}\"}")
        .toPact();
}

遇到的错误

运行测试时出现参数不匹配错误,翻译后内容如下:

Mismatches(mismatches=[PartialMismatch(mismatches=[QueryMismatch(queryParameter=hash, expected=${hashPlaceholder}, actual=C3459H6S, mismatch=预期hash参数值为'${hashPlaceholder}',但实际收到C3459H6S, path= hash)])])

问题原因

你错误地将${hashPlaceholder}作为请求query参数的预期固定值,而非动态匹配占位符。当测试时实际传入真实hash值C3459H6S,Pact会判定参数不符合预期,抛出匹配错误。

正确实现方式

方式一:直接引用请求参数值

使用Pact的请求参数引用语法${request.query.hash},在响应体中直接复用请求的hash参数值,同时用匹配器定义query参数的匹配规则:

@Pact(provider = "myProvider", consumer = "myConsumer")
public RequestResponsePact getContractByHash(PactDslWithProvider builder) {
    return builder
        .uponReceiving("根据hash获取合同的请求")
        .path("/rest/contract")
        // 匹配任意字符串类型的hash参数,可添加正则约束(如匹配大写字母+数字格式)
        .queryParameters(Map.of("hash", Matchers.stringMatcher("^[A-Z0-9]+$", "C3459H6S")))
        .method("GET")
        .willRespondWith()
        .status(200)
        .headers(Map.of("Content-Type", "application/json"))
        // 引用请求中的hash参数值
        .body("{\"hash\": \"${request.query.hash}\"}")
        .toPact();
}

方式二:用DSL构建响应体

如果需要构建更复杂的JSON响应结构,可使用PactDslJsonBody,同样通过${request.query.hash}引用请求参数:

@Pact(provider = "myProvider", consumer = "myConsumer")
public RequestResponsePact getContractByHash(PactDslWithProvider builder) {
    return builder
        .uponReceiving("根据hash获取合同的请求")
        .path("/rest/contract")
        // 匹配任意字符串类型的hash参数
        .queryParameters(Map.of("hash", Matchers.anyString()))
        .method("GET")
        .willRespondWith()
        .status(200)
        .headers(Map.of("Content-Type", "application/json"))
        .body(new PactDslJsonBody()
            .stringValue("hash", "${request.query.hash}")
            // 可添加其他响应字段
            .stringValue("contractName", "示例合同")
            .numberValue("version", 1)
        )
        .toPact();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:35:31