Pact 提供商测试已损坏:pactVerificationTestTemplate » PreconditionViolation

问题描述 投票:0回答:2

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

由于使用本地协议文件使测试变得绿色,我想原因不在我的测试类的代码中,尽管如果它可能有帮助,我在这里提供:

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

契约提供者 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
junit5 pact pact-jvm pact-broker
2个回答
2
投票

JUnit 5错误

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

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

从您提供的信息中我唯一能看到的是 JSON 中的 URL

"http://localhost/pacts/provider/provider-    name/latest"
有问题(提供程序名称中有空格)。如果这不仅仅是 SO 的格式问题,那么将不匹配(代理可能会返回带有该 URL 的 404)。

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


0
投票

我想为像我这样的新手添加信息。我在 Spring Boot Camel 项目中遇到了以下异常:

org.junit.platform.commons.PreconditionViolationException: You must register at least one TestTemplateInvocationContextProvider that supports @TestTemplate method

这是我通过谷歌搜索的页面,所以我将发布如何解决该问题,这非常简单。导出@Test注解时,从org.junit.jupiter.api添加,而不是从org.apache.camel.test.junit5.params添加。

© www.soinside.com 2019 - 2024. All rights reserved.