Pact JVM обновляет обратную совместимость

Я пытаюсь обновить десятки услуг, чтобы au.com.dius:pact-jvm-consumer-junit_2.12:3.5.12 от au.com.dius:pact-jvm-consumer-junit_2.11:3.2.13 но похоже, что новая потребительская версия генерирует пакты, что старая версия провайдера (au.com.dius:pact-jvm-provider-junit_2.11:3.2.13) не выдерживаю.

Старый пакт имел хеш-карту с соответствующими правилами, добавляемыми в корень, как показано ниже

{
    "consumer": {
        "name": "consumer-amqp"
    },
    "provider": {
        "name": "prodvider-amqp"
    },
    "messages": [
        {
            "description": "amqp contract",
            "contents": {
                "body": {
                    "guidProperty": "795ecfd5-a3a5-430f-a0cd-1569df61bff6"
                }
            },
            "matchingRules": {
                "$.body.body.guidProperty": {
                    "regex": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
                }
            }
        }
    ],
    "metadata": {
        "pact-specification": {
            "version": "3.0.0"
        },
        "pact-jvm": {
            "version": "3.2.13"
        }
    }
}

Новый потребитель добавляет и обертку body вокруг спичек. Ниже приведен пример того же пакта, сгенерированного новой потребительской версией.

{
  "consumer": {
    "name": "consumer-amqp"
  },
  "provider": {
    "name": "prodiver-amqp"
  },
  "messages": [
    {
      "description": "contract",
      "contents": {
        "body": {
          "guidProperty": "e2490de5-5bd3-43d5-b7c4-526e33f71304"
        }
      },
      "matchingRules": {
        "body": {
          "$.guidProperty": {
            "matchers": [
              {
                "match": "regex",
                "regex": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
              }
            ],
            "combine": "AND"
          }
        }
      }
    }
  ],
  "metadata": {
    "pact-specification": {
      "version": "3.0.0"
    },
    "pact-jvm": {
      "version": "3.5.12"
    }
  }
}

Из-за этого изменения провайдер не может проанализировать соответствующие правила со следующей ошибкой:

body
^
10:21:24.526 [main] DEBUG au.com.dius.pact.matchers.JsonBodyMatcher - compareValues: No matcher defined for path List($, body, body, guidProperty), using equality
10:21:24.527 [main] WARN au.com.dius.pact.matchers.Matchers$ - Path expression body is invalid, ignoring: [1.1] failure: `$' expected but `b' found

java.lang.AssertionError: 

comparison

{$.body.body.guidProperty=Expected 'e2490de5-5bd3-43d5-b7c4-526e33f71304' but received 'aff876f5-5014-937c-6855-c099f9857437'

Глядя на спецификацию v3, новое сообщение кажется действительным, разве старая библиотека провайдера (v3.2.13) не поддерживает его? Я просмотрел код и нашел этот коммит, который мне кажется где было внесено изменение.

По моим тестам, новая библиотека провайдера (3.5.12) может обрабатывать как старый, так и новый форматы, но если и новый провайдер, и старые потребительские библиотеки присутствуют в classpath http, тесты контрактов http завершаются неудачно с ошибками времени выполнения.

Вопросы:

1) Есть ли способ заставить нового потребителя создавать пакты по-старому, и соответствует ли эта форма спецификации?

2) Есть ли способ обновить провайдера до новой версии и при этом оставить прежнюю потребительскую библиотеку в пути и не получить сбои?

1 ответ

Как указал J_A_X, похоже, что коммит, на который вы ссылались, исправил ошибку, когда пакты, которые должны были быть версией 3, не были полностью совместимы с версией 3 (они использовали старый формат соответствия)

1) Есть ли способ заставить нового потребителя создавать пакты по-старому, и соответствует ли эта форма спецификации?

Да и да. Вы должны быть в состоянии это исправить, установив системное свойство pact.provider.version в 2 - тогда и старая, и новая версии смогут прочитать сгенерированный договор.

2) Есть ли способ обновить провайдера до новой версии и при этом оставить прежнюю потребительскую библиотеку в пути и не получить сбои?

Да, если вы просите старую потребительскую версию генерировать версию 2 соглашения (но в идеале, почему бы не обновить оба до одной и той же версии?)

Другие вопросы по тегам