0

我有一个项目,我们正在使用消息提供程序,因为它涉及基于 Apache kafka 的消息传递。

消费者方面的 maven 目标在本地和 Jenkins 都运行良好。

提供方的协议验证在 Jenkins 中失败,说“没有为交互找到带注释的方法”。

我的 POM.xml 配置如下:

<plugin>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-provider-maven_2.11</artifactId>
<version>3.5.2</version>
<configuration>
    <!-- pactBrokerUrl,user name,password and project version required only 
                    for consumer -->
    <pactBrokerUrl>localhost</pactBrokerUrl>
    <projectVersion>0.0.1</projectVersion>
    <!-- service provider required only for producer -->
    <serviceProviders>
        <!-- <serviceProvider><name>provider</name><verificationType>ANNOTATED_METHOD</verificationType><consumers><consumer><name>consumer</name><pactUrl>pacturl</pactUrl></consumer></consumers></serviceProvider> -->
        <serviceProvider>
            <name>provider</name>
            <verificationType>ANNOTATED_METHOD</verificationType>
            <consumers>
                <consumer>
                    <name>consumer</name>
                    <pactUrl>pacturl</pactUrl>
                </consumer>
            </consumers>
        </serviceProvider>
    </serviceProviders>
    <classpathElements>
        <classpathElement>
          src/test/java
      </classpathElement>
    </classpathElements>
    <configuration>
        <pact.showStacktrace>true</pact.showStacktrace>
    </configuration>
</configuration>
</plugin>
4

2 回答 2

2

在进行生产者端测试时,您需要提供 JSON 合同。在这些合同中,您有生产者的名称。从您的提供者测试中,您需要参考合同的位置和提供者的名称。

@RunWith(RestPactRunner.class) // Custom pact runner, child of PactRunner which runs only REST tests
@Provider("myProducersNameAsItApearsInContract") // Set up name of tested provider
@PactFolder("path/to/pact/contracts") // Point where to find pacts (See also section Pacts source in documentation)

供应商名称在合同中如下:

    "provider": {
    "name": "myProvider"
},

编辑:

这里的问题是测试运行良好,并且在从我的本地计算机运行时会拾取带注释的方法,但是当我们从 Jenkins 运行时,在 pact:verify 期间会引发特定错误。

您将不得不为您的项目放置相对于 Jenkins 工作区的完整协议文件夹。由于我们保留了我们的契约合同,src/test/resources/pacts因此我们的 @PactFolder 值如下:

@PactFolder("src/test/resources/pacts")
于 2017-09-12T17:59:55.410 回答
0

解决了这个问题。这是我们通过使用 -Dskiptests 跳过测试类来编译项目的时候。因此,在我们运行 pact:verify 之后,测试类路径不包含在搜索中。

通过使用 mvn test-compile compile 然后运行 ​​pact:verify 编译测试类来修复它。现在每次上课都在上课。

于 2017-09-20T07:04:09.657 回答