当前位置: 首页 > 知识库问答 >
问题:

Pact提供程序测试中断:pactVerificationTestTemplate?PreconditionViolution

轩辕远
2023-03-14
{"_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() {
    }
}

由于使用本地协议文件不是一个选项,我真的想知道如何修复错误,并将感谢任何有帮助的意见。

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

共有1个答案

岳鸿畴
2023-03-14

JUnit 5错误org.JUnit.platform.commons.util.PreconditionViolationException:没有支持TestTemplateInvocationContextProvider提供了调用上下文表示没有提供测试上下文,因此无法调用模板化的测试方法。这可能是由于没有任何协议要验证(每个协议都产生一个调用上下文)。

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

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

 类似资料:
  • 关于测试提供程序,我有几个问题: 在进行测试之前,是否需要启动提供程序服务?我应该在测试中到达实际的提供者endpoint吗?例如,假设我的提供者代码库上有一个GET/dogsendpoint。运行测试时,是否需要在本地启动服务,点击/dogsendpoint,然后用pact文件验证为该endpoint返回的响应? 如果我想将其作为配置项管道的一部分运行(我使用的是Circloci),那么有哪些最

  • 我正在使用pact-jvm提供程序Spring。我有两个不同的pact(.json)文件,比如(order.json和irs.json),我需要按顺序运行它们(order后面是irs),但是根据字母顺序选择测试类,irs首先运行,order其次运行。是否有方法调用、执行特定的测试类提供程序状态或定义测试类执行顺序?

  • 我想为我的客户和API建立契约测试。我的API不能在本地运行,所以我希望能够在部署到生产之前,针对已部署的API临时版本运行提供程序测试。 我在网上看到的提供程序测试的大多数示例都使用了localhost。当尝试对我部署的HTTPSendpoint运行提供程序测试时,测试失败,显示。是不支持HTTPS协议,还是我遗漏了什么? 使用pact-provider-verifier cmd line工具工

  • 我们有一个提供程序测试,只是在Jenkins上失败了,这阻止了我的调试。 (有些省略……) 交互在pact文件中如下所示: 我的印象是名称应该匹配type而不是确切的值,而且在diff中似乎有一个“name”字段。

  • 我试图按照Pact.io上的文档编写一个简单的集成测试。不幸的是,我得到一个例外,如下所示: