【问题标题】:How to verify stringified json in pact如何在协议中验证字符串化的 json
【发布时间】:2020-11-18 18:42:41
【问题描述】:

我正在尝试使用异步通信在两个服务之间建立协议。

这是我用来生成契约的代码:

@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "provider", providerType = ProviderType.ASYNCH)
public class StringifiedPactTest {

    @Pact(consumer = "consumer", provider = "provider")
    public MessagePact generatePact(MessagePactBuilder builder) {
        return builder.hasPactWith("provider")
                .expectsToReceive("A valid aws sns event")
                .withContent(new PactDslJsonBody().stringType(new String[]{"MessageId", "TopicArn"}).stringValue("Message", new PactDslJsonBody().stringType("Value", "Foo").toString()))
                .toPact();
    }

    @Test
    @PactTestFor(pactMethod = "generatePact")
    public void buildPact(List<Message> messages) {

    }
}

而生成的契约是

{
  "consumer": {
    "name": "consumer"
  },
  "provider": {
    "name": "provider"
  },
  "messages": [
    {
      "description": "A valid aws sns event",
      "metaData": {
        "contentType": "application/json"
      },
      "contents": {
        "TopicArn": "string",
        "Message": "{\"Value\":\"Foo\"}",
        "MessageId": "string"
      },
      "matchingRules": {
        "body": {
          "$.MessageId": {
            "matchers": [
              {
                "match": "type"
              }
            ],
            "combine": "AND"
          },
          "$.TopicArn": {
            "matchers": [
              {
                "match": "type"
              }
            ],
            "combine": "AND"
          }
        }
      }
    }
  ],
  "metadata": {
    "pactSpecification": {
      "version": "3.0.0"
    },
    "pact-jvm": {
      "version": "4.0.10"
    }
  }
}

这意味着生产者应该有一个匹配 {"Value" : "Foo"} 的 "Message",像 {"Value" : "Bar" } 这样的任何其他组合都不会成功。 有没有办法在字符串化的 json 中添加匹配规则? 谢谢!

【问题讨论】:

    标签: json testing stringify pact pact-jvm


    【解决方案1】:

    这是一个来自我们测试的匿名示例。希望它有用。这将创建一个仅在类型上匹配的协定。因此,在提供商方面,当我根据合同进行测试时,我对 categoryName 有什么值并不重要,只要它是 stringType:

    @PactTestFor(providerName = "provider-service", providerType = ProviderType.ASYNCH)
    public class providerServiceConsumerPactTest {
    
        private static String messageFromJson;
    
        @BeforeAll
        static void beforeAll() throws Exception {
            messageFromJson = StreamUtils.copyToString(new ClassPathResource("/json/pact/consumer-service_provider-service.json").getInputStream(), Charset.defaultCharset());
    
        }
    
        @Pact(provider = "provider-service", consumer = "consumer-service")
        public MessagePact providerServiceMessage(MessagePactBuilder builder) {
            DslPart body = new PactDslJsonBody()
                .object("metaData")
                    .stringType("origin", "provider-service")
                    .datetimeExpression("dateCreated", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
                .closeObject()
                .minArrayLike("categories", 0, 1)
                    .stringType("id", "example data")
                    .stringType("categoryName", "example data")
                    .booleanType("clearance", false)
                    .closeObject()
                .closeArray();
    
            return builder
                    .expectsToReceive("a provider-service update")
                    .withContent(body)
                    .toPact();
        }
    
        @Test
        @PactTestFor(pactMethod = "providerServiceMessage")
        public void testProviderServiceMessage(MessagePact pact) {
    
            // State
    
            final String messageFromPact = pact.getMessages().get(0).contentsAsString();
    
            // Assert
    
            JSONAssert.assertEquals(messageFromPact, messageFromJson, false);
        }
    

    【讨论】:

      【解决方案2】:

      我遇到了完全相同的问题,不幸的是,我认为不可能告诉 Pact 解析字符串化的 JSON 并查看它(例如,验证 parse(Message).Value === "Foo"在你的例子中)。

      您能做的最好的事情就是编写一个正则表达式来匹配您期望的字符串。这很糟糕,因为没有简单的方法可以忽略 JSON 键的顺序(例如 "{\"a\":\"1\", \"b\":\"2\"}""{\"b\":\"2\", \"a\":\"1\"}" 会比较不同)但是 AFAIK Pact 只是缺少我们正在寻找的解析功能,所以它提供的唯一工具是正则表达式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 2021-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多