Pact-JVM中如何仅匹配列表项类型而非值与长度?
问题解决:Pact仅匹配列表对象类型而非值和长度
问题根源
- 列表长度被强制校验:
eachLike("myData", 2)中的第二个参数2会让Pact默认校验返回列表的长度必须等于2——这个参数同时定义了示例长度和严格匹配的长度规则,不符合你不限制长度的需求。 - 字段值被精确匹配:
stringType("foo", "foo")的第二个参数是示例值,Pact默认会把它当作期望值做精确匹配,而不是仅校验字段类型。
修改方案
- 取消列表长度限制:使用不带长度参数的
eachLike("myData"),这样Pact只会校验返回值是列表、元素符合指定结构,不会限制具体长度;如果需要允许空列表,可替换为arrayLike("myData")。 - 仅校验字段类型:把带示例值的类型方法(如
stringType("foo", "foo"))改成只传字段名的形式(stringType("foo")),这样Pact只会校验字段的类型,不再匹配具体值。
修改后的代码示例
@Pact(consumer = "Consumer", provider = "Provider") fun multi(builder: PactBuilder): V4Pact { return builder .expectsToReceiveHttpInteraction("multi") { httpBuilder -> httpBuilder .withRequest { httpRequestBuilder -> httpRequestBuilder .path("/multi") .method("GET") } .willRespondWith { httpResponseBuilder -> httpResponseBuilder .status(200) .body(PactDslJsonBody() .`object`("myData", PactDslJsonBody() .eachLike("myData") // 去掉长度参数,不限制列表长度 .stringType("foo") // 仅校验字段为字符串类型 .`object`("bar", PactDslJsonBody() .stringType("bar") // 同理,仅校验类型 ) ) ) } } .toPact()
补充说明
如果需要更灵活的列表匹配规则:
minArrayLike("myData", 1):要求列表长度至少为1maxArrayLike("myData", 5):要求列表长度最多为5
对于其他类型字段,比如数字、布尔值,同样可以用numberType("字段名")、booleanType("字段名")这类仅传字段名的方法,实现仅类型匹配。
内容的提问来源于stack exchange,提问作者Ruth
相关产品推荐
相关产品推荐

