如何在Pact(pact-jvm-consumer)的Lambda DSL中建模命名数组与对象
Pact Lambda DSL: 搞定命名数组、嵌套对象及多元素字符串数组建模
针对你给出的JSON结构,我整理了对应的Lambda DSL实现代码,同时逐个解决你提出的三个问题:
完整的DSL代码实现
PactDslJsonBody body = new PactDslJsonBody() // 解决问题1:声明命名数组Inventory,包含单元素对象 .arrayNamed("Inventory") .object() // 命名对象Car .object("Car") .stringValue("gearbox", "automatic") .numberValue("ProductId", 30212) .closeObject() // 解决问题2:声明命名对象Camera,内部包含Conditions数组 .object("Camera") .numberValue("EndPrice", 1235) // 解决问题3:在命名数组Conditions中声明两个示例字符串值 .arrayNamed("Conditions") .stringValue("FaultyButtons") .stringValue("FaultyCasing") .closeArray() .stringValue("ModelId", "650") .closeObject() .closeObject() .closeArray() .booleanValue("IsSuccess", true) .stringValue("Info", "Ok");
逐个问题拆解说明
问题1:声明命名数组Inventory
使用.arrayNamed("Inventory")创建指定名称的数组,因为数组是单元素结构,所以在数组内部调用.object()定义数组里的唯一对象,再在这个对象中嵌套Car和Camera两个命名对象(通过.object("Car")和.object("Camera")实现)。问题2:声明包含数组的命名对象Camera
先通过.object("Camera")创建命名对象,在这个对象内部,用.arrayNamed("Conditions")定义Conditions数组,后续就可以往这个数组里添加元素了。问题3:在命名数组中添加两个示例字符串
在Conditions数组的代码块里,直接连续调用.stringValue()添加两个字符串示例值;如果需要更灵活的契约匹配(比如允许任意格式的字符串),也可以用.stringMatcher(".+", "FaultyButtons")和.stringMatcher(".+", "FaultyCasing")替代,具体根据你的校验需求调整。
需要注意的是,每打开一个arrayNamed或object,都要记得用closeArray()或closeObject()闭合,保证DSL结构的正确性。
内容的提问来源于stack exchange,提问作者Mattias Malmgren
相关产品推荐
相关产品推荐

