Cara memverifikasi json yang dirangkai di pakta

Saya mencoba membangun perjanjian antara dua layanan menggunakan komunikasi asinkron.

Ini adalah kode yang saya gunakan untuk membuat perjanjian:

@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) {

    }
}

Dan perjanjian yang dihasilkan adalah

{
  "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"
    }
  }
}

Ini berarti produser harus memiliki Pesan yang cocok dengan {Value : Foo}, kombinasi lain seperti {Value : Bar } tidak akan berhasil. Apakah ada cara untuk menambahkan aturan yang cocok di dalam json yang dirangkai? Terima kasih!


person Javier Molina Alonso    schedule 29.07.2020    source sumber


Jawaban (2)


Berikut adalah contoh anonim dari pengujian yang kami miliki. Semoga bermanfaat. Ini menciptakan perjanjian yang hanya cocok pada tipenya. Jadi di sisi penyedia, ketika saya menguji kontrak, tidak masalah nilai apa yang saya miliki untuk CategoryName misalnya, selama itu adalah 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);
    }
person wideawakewesley    schedule 30.07.2020

Saya mengalami masalah yang persis sama, dan sayangnya menurut saya tidak mungkin memberi tahu Pakta untuk mengurai JSON yang dirangkai dan melihat ke dalamnya (misalnya untuk memverifikasi parse(Message).Value === Foo dalam contoh Anda).

Hal terbaik yang dapat Anda lakukan adalah menulis ekspresi reguler untuk mencocokkan string yang Anda harapkan. Hal ini menyebalkan karena tidak ada cara mudah untuk mengabaikan pengurutan kunci JSON (misalnya "{\"a\":\"1\", \"b\":\"2\"}" dan "{\"b\":\"2\", \"a\":\"1\"}" akan berbeda) tetapi Pakta AFAIK tidak memiliki fungsi penguraian yang kami cari, jadi satu-satunya alat yang disediakannya adalah regex.

person Keenan Pepper    schedule 31.03.2021