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

