协议提供者测试已损坏:协议验证测试模板 » 前提条件违规



我对CDC测试很陌生,只迈出了第一步。我已经部署了 Pact-Broker(docker-compose(,运行在 localhost:80。消费者将生成的协议成功发送给代理,但提供商似乎无法获得有效的合约(但这只是假设(。

我正在使用spring-boot,maven,jUnit5。应用程序测试在 Ubuntu 上运行。在本地目录中将 PactFolder 与使用者生成的 pact-contract 一起使用会导致成功的测试。

当我切换到@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 Pact 依赖项:

<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>

The pact-provider 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

JUnit 5 错误org.junit.platform.commons.util.PreconditionViolationException: No supporting TestTemplateInvocationContextProvider provided an invocation context表示未提供测试上下文,因此无法调用模板化测试方法。这可能是由于没有任何协议需要验证(每个协议都会产生调用上下文(。

现在解决实际问题,为什么您没有从经纪人那里获得任何协议来验证。Pact Broker 本质上是一个存储库,JUnit 5 验证框架将使用 pact 类上的所有注释来创建要发送到 Pact Broker 的查询。此查询不返回任何协议,因此某处一定存在不匹配。

我从您提供的信息中唯一能看到的是 JSON 中"http://localhost/pacts/provider/provider- name/latest"的 URL 存在问题(提供程序名称中有空格(。如果这不仅仅是 SO 的格式问题,那么这将不匹配(代理可能会返回带有该 URL 的 404(。

如果这不是问题所在,请检查当您从 Maven 运行验证时,是否可以像测试框架一样访问代理。启用 DEBUG 级别日志记录将显示发出的所有请求。使用类似 curl 的东西并尝试相同的请求以查看您得到什么。

相关内容

  • 没有找到相关文章

最新更新