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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:57:56