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

Pact Contract Test :How to generate dynamic PactDslJsonBody using json value?

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

契约体:

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

断言响应:

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

基于 Assert Response(作为输入)并创建类似

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

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

断言响应:

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

我知道在 body 中我们可以提供 json 本身。但我需要使用 Json.

生成 PactDSLJson 正文

从 JSON 文档自动生成 DSL 类 在技术上是可行的,但我看不到您的示例的好处。大多数情况下,匹配器是根据 JSON 有效负载的语义定义的,而不是语法。

例如,根据您的示例 JSON,它会将 webId 属性视为一个字符串,并生成一个字符串类型匹配器。不过,明明是数字,不是字符串。

自动生成的 DSL 正文将接受以下 JSON:

{"testsuite":{"webId":"This is not a web ID &^*&^%"}}

但是,用于从 JSON 文档创建框架消费者测试的自动生成工具可以根据 JSON 的语义进行更改,这将非常有用。

我们构建了一个库来从 Java Bean 生成 PactDslJsonBody。这不是你的直接用例,因为你想使用 JSON 作为输入,但也许你设计了你的端点来公开 Java Beans,所以你可以将它们用于你的契约。

您可能想看看 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 库与为您生成测试数据实例的夹具生成器一起工作得很好 Java Beans。您可以使用我们的夹具生成器 (https://github.com/remondis-it/resample),但所有其他 Java Bean 实例生成器也应该可以工作。