契约契约测试:如何使用json值生成动态PactDslJsonBody?

时间:2018-01-19 11:22:34

标签: pact pact-jvm pact-broker

如何使用json值生成动态PactDslJsonBody? Pact团队是否可以提供自动构建器来动态分配主体?

契约身体:

body(new PactDslJsonBody()
                .object("testsuite") 
                .stringType("webId","24255")  
                .closeObject());        

断言回复:

"{\"testsuite\":{\"webId\":\"24255\"}}";

基于断言响应(作为输入)并创建类似

的dslbody
String json = "{\"testsuite\":{\"webId\":\"24255\"}}"

//body(json);
body(generatePactDSLJsonBody(json));        

断言回复:

assertEqual("{\"testsuite\":{\"webId\":\"24255\"}}",json);

我知道在身体上我们可以提供json本身。但我需要使用Json生成PactDSLJson主体。

2 个答案:

答案 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实例生成器也都可以使用。