Испорченные тесты провайдера Pact: pactVerificationTestTemplate "PreconditionViolation
Я довольно плохо знаком с тестированием CDC и делаю только первые шаги. Я развернул Pact-Broker (docker-compose), работающий на localhost:80. Потребитель успешно отправляет сгенерированные договоры брокеру, но кажется, что поставщик не может получить действующий контракт (но это только предположение).
Я использую Spring-Boot, Maven, JUnit5. Тесты приложений выполняются в Ubuntu. Использование PactFolder с сгенерированным потребителем пакт-контрактом в локальном каталоге приводит к успешным тестам.
Когда я переключаюсь на аннотацию @PactBroker, провайдер может подключиться к брокеру и получает следующий ответ (я получил его из журналов отладки):
{"_links":
{"self":{
"href":"http://localhost/pacts/provider/provider- name/latest","title":"Latest pact versions for the provider provider-name"},
"pb:provider":{"href":"http://localhost/pacticipants/provider-name",
"name":"provider-name"},
"pb:pacts":[
{"href":"http://localhost/pacts/provider/provider-name/consumer/consumer-name/version/1.0.0",
"title":"Pact between consumer-name (v1.0.0) and provider-name",
"name":"consumer-name"}
],
"provider":{
"href":"http://localhost/pacticipants/provider-name",
"title":"provider-name",
"name":"DEPRECATED - please use the pb:provider relation"
},
"pacts":[
{"href":"http://localhost/pacts/provider/provider-name/consumer/consumer-name/version/1.0.0",
"title":"DEPRECATED - please use the pb:pacts relation. Pact between consumer-name (v1.0.0) and provider-name",
"name":"consumer-name"
}
]
}
}
И результаты теста в следующем:
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 9.758 s
FAILURE! - in com.tis.payment.mapper.PaymentMapperApplicationTests
[ERROR] pactVerificationTestTemplate{PactVerificationContext}
Time elapsed: 9.752 s
ERROR!
org.junit.platform.commons.util.PreconditionViolationException:
No supporting TestTemplateInvocationContextProvider provided an invocation context
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] PaymentMapperApplicationTests.pactVerificationTestTemplate » PreconditionViolation
[INFO]
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
Поскольку использование локального файла pact делает тесты зелеными, я предполагаю, что причина не в коде моего тестового класса, хотя, если это могло бы быть полезным, я предоставлю это здесь:
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
properties = "server.port=8082")
@Provider("provider-name")
@PactBroker(host = "localhost", port = "80", tags="latest")
//@PactFolder("target/pacts") # uncomment to use local pact files
public class ApplicationTests {
@MockBean
private ProviderServiceClient providerServiceClient;
@BeforeEach
void setupTestTarget(PactVerificationContext context) {
context.setTarget(new HttpTestTarget("localhost", 8082, "/"));
}
@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider.class)
void pactVerificationTestTemplate(PactVerificationContext context) {
context.verifyInteraction();
}
@State({"valid payment file"})
public void toValid() {
ServiceResponse response = new ServiceResponse();
response.setBatchId("test");
response.setId(1L);
when(providerServiceClient.save(any())).thenReturn(response);
}
@State({"invalid payment file"})
public void toInvalid() {
}
}
Поскольку использование локальных файлов пакта не вариант, мне действительно интересно, как исправить ошибку, и буду благодарен за любые полезные комментарии.
зависимости пакта maven:
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-model</artifactId>
<version>3.5.22</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-provider-junit5_2.12</artifactId>
<version>3.5.22</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-consumer-junit5_2.12</artifactId>
<version>3.5.22</version>
<scope>test</scope>
</dependency>
Плагин для maven для публикации договоров потребителей:
<plugin>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-provider-maven_2.12</artifactId>
<version>3.5.22</version>
<configuration>
<pactBrokerUrl>http://localhost:80</pactBrokerUrl>
<trimSnapshot>true</trimSnapshot>
<!-- Defaults to false -->
</configuration>
</plugin>
pact-провайдер docker-compose.yml:
version: '2'
services:
postgres:
image: postgres
restart: always
# healthcheck:
# test: psql postgres --command "select 1" -U postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: postgres
broker_app:
image: dius/pact-broker
depends_on:
- postgres
ports:
- "80:80"
links:
- postgres
environment:
PACT_BROKER_DATABASE_USERNAME: postgres
PACT_BROKER_DATABASE_PASSWORD: password
PACT_BROKER_DATABASE_HOST: postgres
PACT_BROKER_DATABASE_NAME: postgres
2 ответа
Хочу добавить информацию для таких новичков, как я. В моем проекте Spring Boot Camel я столкнулся со следующим исключением:
org.junit.platform.commons.PreconditionViolationException: You must register at least one TestTemplateInvocationContextProvider that supports @TestTemplate method
и это страница, на которую меня привел поиск в Google, поэтому я опубликую, как исправлена эта проблема, и это действительно просто. При экспорте аннотации @Test добавляйте ее из org.junit.jupiter.api, а не из org.apache.camel.test.junit5.params.
Ошибка JUnit 5 org.junit.platform.commons.util.PreconditionViolationException:
No supporting TestTemplateInvocationContextProvider provided an invocation context
означает, что тестовый контекст не был предоставлен, поэтому шаблонный тестовый метод не может быть вызван. Вероятно, это связано с отсутствием каких-либо пактов для проверки (каждый пакт приводит к контексту вызова).
Теперь перейдем к решению реальной проблемы, касающейся того, почему вы не получаете никаких договоров для проверки от брокера. Pact Broker - это, по сути, хранилище, и среда проверки JUnit 5 будет использовать все аннотации класса pact для создания запроса для отправки в Pact Broker. Этот запрос не возвращает никаких пактов, поэтому где-то должно быть несоответствие.
Единственное, что я вижу по предоставленной вами информации, это URL "http://localhost/pacts/provider/provider- name/latest"
в JSON есть проблема (есть пробел в имени провайдера). Если это не просто проблема форматирования с SO, то это не будет соответствовать (брокер, вероятно, вернет 404 с этим URL).
Если это не проблема, убедитесь, что при запуске проверки из Maven вы можете получить доступ к брокеру так же, как и в тестовой среде. Включение регистрации уровня DEBUG покажет вам все запросы. Используйте что-то вроде curl и попробуйте те же запросы, чтобы увидеть, что вы получите.