【问题标题】:Pact Contract Test :How to generate dynamic PactDslJsonBody using json value?Pact 合同测试:如何使用 json 值生成动态 PactDslJsonBody?
【发布时间】:2018-06-28 15:06:17
【问题描述】:

如何使用 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 主体。

【问题讨论】:

    标签: pact pact-jvm pact-broker


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-12-01
        • 2022-07-26
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        相关资源
        最近更新 更多