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
соглашения (но в идеале, почему бы не обновить оба до одной и той же версии?)