如何使用json值生成动态PactDslJsonBody? Pact团队是否可以提供自动构建器来动态分配主体?
契约身体:
body(new PactDslJsonBody()
.object("testsuite")
.stringType("webId","24255")
.closeObject());
断言回复:
"{\"testsuite\":{\"webId\":\"24255\"}}";
基于断言响应(作为输入)并创建类似
的dslbodyString json = "{\"testsuite\":{\"webId\":\"24255\"}}"
//body(json);
body(generatePactDSLJsonBody(json));
断言回复:
assertEqual("{\"testsuite\":{\"webId\":\"24255\"}}",json);
我知道在身体上我们可以提供json本身。但我需要使用Json生成PactDSLJson主体。
答案 0 :(得分:1)
从技术上讲,可以从JSON文档自动生成DSL类,但我没有看到您示例的好处。大多数情况下,匹配器是根据JSON有效负载的语义定义的,而不是语法。
例如,从您的示例JSON中,它会将webId属性视为字符串,并生成字符串类型匹配器。但是,它显然是一个数字,而不是一个字符串。
自动生成的DSL正文将接受以下JSON:
{"testsuite":{"webId":"This is not a web ID &^*&^%"}}
但是,用于从JSON文档创建骨架使用者测试的自动生成工具可以根据JSON的语义进行更改,这将非常有用。
答案 1 :(得分:0)
我们建立了一个从Java Bean生成PactDslJsonBody
的库。这不是直接的用例,因为您想使用JSON作为输入,但是也许您设计了终结点来公开Java Bean,因此可以将它们用于Pact。
您可能想看看https://github.com/remondis-it/pact-consumer-builder。
使用此库,您可以基于每个字段或每个类型定义PactDslJsonBody
映射。在我们的案例中,这将样板代码减少到几乎一线:
PactDslJsonBody jsonBody = ConsumerExpects.type(YOUR_BEAN_TYPE.class)
.useTypeMapping(...)
// Other field or type configurations
.build(new PactDslJsonBody(), YOUR_BEAN_SAMPLE_INSTANCE);
这会在PactDslJsonBody
上执行必要的调用,您可以将结果用于Pact测试。
顺便说一句:Pact Consumer Builder库与Fixture生成器一起很好地工作,该Fixture生成器为您的Java Bean生成测试数据实例。您可以使用我们的Fixture生成器(https://github.com/remondis-it/resample),但其他所有Java Bean实例生成器也都可以使用。