如何通过PactDslJsonArray在消费者测试中生成多元素JSON数组?
Pact消费者测试:多元素JSON数组的契约定义修正
在编写Pact消费者测试时,预期响应是包含多个对象的JSON数组(如包含Germany、Netherlands等结构一致的对象),但当前编写的DSL代码仅生成了单元素数组的契约规则,导致提供者测试时抛出错误:
1.1) body: $ Expected a List with 1 elements but received 8 elements
原DSL代码:
val responseBody = PactDslJsonArray().`object`() .stringType("name") .booleanType("flagRequired") .`object`("additionalInfo") .`object`("details") .stringType("logo")
修正方案
问题根源是默认的PactDslJsonArray().object()只会定义仅包含1个元素的数组规则,Pact会校验数组长度严格等于1,而提供者返回了8个元素,因此不匹配。可以通过两种方式修正:
方式1:手动添加多个对象(适用于确定元素数量的场景)
多次调用.object()方法,为数组添加多个结构一致的对象定义,注意用closeObject()闭合嵌套对象:
val responseBody = PactDslJsonArray() // 第一个数组元素对象 .`object`() .stringType("name") .booleanType("flagRequired") .`object`("additionalInfo") .`object`("details") .stringType("logo") .closeObject() // 闭合details对象 .closeObject() // 闭合additionalInfo对象 .closeObject() // 闭合第一个数组元素 // 第二个数组元素对象 .`object`() .stringType("name") .booleanType("flagRequired") .`object`("additionalInfo") .`object`("details") .stringType("logo") .closeObject() .closeObject() .closeObject() // 可按需添加更多元素...
方式2:使用minArrayLike定义动态长度数组(推荐,适用于不确定元素数量的场景)
使用minArrayLike(n)方法指定数组至少包含n个元素,Pact只会校验元素结构,不会限制最大长度:
val responseBody = PactDslJsonArray() .minArrayLike(1) // 指定数组至少有1个元素 .`object`() .stringType("name") .booleanType("flagRequired") .`object`("additionalInfo") .`object`("details") .stringType("logo") .closeObject() .closeObject() .closeObject() .closeArray()
如果需要指定元素数量范围(比如2-5个),可使用arrayLike(min, max);若仅关心元素结构、不限制数量,也可以用eachLike()方法。
内容的提问来源于stack exchange,提问作者Ozzy
相关产品推荐
相关产品推荐

