Соответствие stringType в контракте V3.0 для сообщения AMQ выполняет буквальное сопоставление вместо сопоставления типов - PullRequest
0 голосов
/ 13 июня 2019

У меня есть контракт, который использует stringType для соответствия имени файла.В контракте также указывается соответствие по типу, но когда я запускаю тест на стороне провайдера, выполняется буквальное совпадение.Я включил контракт, JSON, который отправляется, и снимок экрана во время отладки.Я заметил, что TypeMatcher инициализируется в MatchingRuleGroup, но у него нет полей.Я не уверен, что это правильно

Я пробовал 3 сценария:

  • stringValue ("bestandsid", "20190219_foo_20190124.txt") -> это работает

  • stringType ("bestandsid", "20190101_foo_20190124.txt") -> не работает, поскольку он буквально ожидает 20190101_foo_20190124.txt, но получил 20190219_foo_20190124.txt

  • stringType ("bestandsid") -> не работает.Он буквально ожидает 'string', но получил 20190219_foo_20190124.txt

У провайдера я использую

pact-jvm-provider-spring_2.12 - Версия 3.6.2

У потребителя я использую

pact-jvm-consumer-junit_2.12 - Версия 3.6.2

pact-jvm-consumer-java8_2.12 - Версия 3.6.2

ДОГОВОР:

{
    "consumer": {
        "name": "Consumer-event"
    },
    "provider": {
        "name": "Provider"
    },
    "messages": [
        {
            "description": "A message notifying a newly available foo file",
            "metaData": {
                "bestandstype": "foo",
                "Content-Type": "application/json"
            },
            "contents": {
                "headers": {
                    "bestandstype": "foo",
                    "Content-Type": "application/json"
                },
                "payload": {
                    "bestandstype": "foo",
                    "bestandsid": "string"
                }
            },
            "providerStates": [
                {
                    "name": "A new FOO file is extracted"
                }
            ],
            "matchingRules": {
                "body": {
                    "$.payload$.bestandsid": {
                        "matchers": [
                            {
                                "match": "type"
                            }
                        ],
                        "combine": "AND"
                    }
                }
            }
        }
    ],
    "metadata": {
        "pactSpecification": {
            "version": "3.0.0"
        },
        "pact-jvm": {
            "version": "3.6.2"
        }
    }
}

АКТУАЛЬНОЕ СОБЫТИЕ

{
    "headers": {
        "Content-Type": "application/json",
        "bestandstype": "foo",
        "id": "6838a619-efb7-6867-28bc-eb24609aa980",
        "timestamp": 1560410882485
    },
    "payload": {
        "afleidDatum": null,
        "bestandsid": "20190219_foo_20190124.txt",
        "bestandstype": "foo",
        "bron": null,
        "planDatum": null,
        "planType": "BAR"
    }
}

ПОТРЕБИТЕЛЬСКИЙ КОНТРАКТ

    @Pact(provider = "DonnaFileshareReader", consumer = "DpcAdapter-event")
    public MessagePact eventNewDpcResource(MessagePactBuilder builder) {

        Map<String, String> metadata = new HashMap<>();
        metadata.put("Content-Type", "application/json");
        metadata.put("bestandstype", "dpc");

        PactDslJsonBody body = new PactDslJsonBody();
        body.object("headers")
            .stringValue("bestandstype", "dpc")
            .stringValue("Content-Type", "application/json")
            .closeObject();
        payload = new PactDslJsonBody();
        payload.stringValue("bestandstype", "dpc")
               .stringValue("bestandsid", EXAMPLE_DPC_FILE_NAME)
               .closeObject();
        body.object("payload", payload);

        return builder.given("A new DPC file is extracted")
                      .expectsToReceive("A message notifying a newly available dpc file")
                      .withMetadata(metadata)
                      .withContent(body)
                      .toPact();
    }

ОШИБКА:


Verifying a pact between DpcAdapter-event and DonnaFileshareReader
  Given A new FOO file is extracted
  A message notifying a newly available foo file
2019-06-13 09:56:54.144  INFO [bar,,,] 7427 --- [           main] org.reflections.Reflections              : Reflections took 9011 ms to scan 388 urls, producing 275 keys and 35566 values 
    generates a message which
      has a matching body (FAILED)
      has matching metadata (OK)

Failures:

0) A message notifying a newly available foo file generates a message which has a matching body
      $.payload.bestandsid -> Expected 'string' but received '20190219_foo_20190124.txt'

ОТЛАДКАDebugging

Я ожидаю, что stringType соответствует типу String.

1 Ответ

0 голосов
/ 14 июня 2019

решаемая.

Изменяя контракт на 1 PactDslJsonBody () вместо использования body (object, payload).

Новый контракт:

body.object("headers")
                .stringValue("bestandstype", "foo")
                .stringValue("Content-Type", "application/json")
                .closeObject();
        body.object("payload")
                .stringValue("bestandstype", "foo")
                .stringType("bestandsid", EXAMPLE_FOO_FILE_NAME)
                .closeObject();

Построение нового сообщения в тесте (хотя вы также можете создать PactDslJsonBody как в исходном вопросе и использовать его)

        JSONObject resourceDetail = (JSONObject)body.getBody();
        JSONObject payload = resourceDetail.getJSONObject("payload");

        Message<byte[]> pactMessage = MessageBuilder
                .withPayload(payload.toString().getBytes())
                .copyHeaders(messageProvider.getMetadata())
                .build();
...