1

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

契约主体:

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

断言响应:

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

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

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

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

断言响应:

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

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

4

2 回答 2

2

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

例如,从您的示例 JSON 中,它会将 webId 属性视为字符串,并生成字符串类型匹配器。但是,它显然是一个数字,而不是一个字符串。

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

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

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

于 2018-01-30T10:30:16.713 回答
1

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

于 2019-09-11T11:25:59.573 回答