Junit5 Pact提供程序测试失败:Pact验证测试模板»;前提违反

Junit5 Pact提供程序测试失败:Pact验证测试模板»;前提违反,junit5,pact,pact-jvm,pact-broker,Junit5,Pact,Pact Jvm,Pact Broker,我是CDC测试的新手,只是迈出了第一步。我已经部署了Pact代理(docker compose),在localhost:80上运行。消费者成功地将生成的契约发送给代理,但提供者似乎无法获得有效的契约(但这只是假设) 我用的是SpringBoot,maven,jUnit5。应用程序测试正在Ubuntu上运行。 将PactFolder与使用者在本地目录中生成的pact协定一起使用,将导致测试成功 当我切换到@PactBroker注释时,提供程序能够连接到代理程序,并收到以下响应(我从调试日志中得到)

我是CDC测试的新手,只是迈出了第一步。我已经部署了Pact代理(docker compose),在localhost:80上运行。消费者成功地将生成的契约发送给代理,但提供者似乎无法获得有效的契约(但这只是假设)

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

当我切换到@PactBroker注释时,提供程序能够连接到代理程序,并收到以下响应(我从调试日志中得到):

测试运行结果如下所示:

[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() {
    }
}
由于使用本地pact文件不是一个选项,我真的很想知道如何修复错误,如果有任何有用的评论,我将不胜感激

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>

JUnit 5错误
org.JUnit.platform.commons.util.PremissionViolationException:
没有支持TestTemplateInvocationContextProvider提供调用上下文
意味着没有提供测试上下文,因此无法调用模板化测试方法。这可能是因为没有任何契约需要验证(每个契约都会在一个调用上下文中产生)

现在来解决实际问题,即为什么您没有从代理处获得任何要验证的契约。Pact代理本质上是一个存储库,JUnit 5验证框架将使用Pact类上的所有注释来创建一个要发送给Pact代理的查询。此查询未返回任何协定,因此一定有不匹配的地方

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

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

<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