契约验证不起作用 - 在消息提供程序测试期间未找到带注释的方法
Pact verify not working - Annotated method not found during message provider test
我有一个使用消息提供程序的项目,因为它涉及基于 Apache kafka 的消息传递。
消费者方面的 maven 目标在本地和 Jenkins 中都运行良好。
提供方协议验证在 Jenkins 中失败说 "No Annotated method found for interaction"。
我的 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>
在进行生产者端测试时,您需要提供 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"
},
编辑:
Problem here is the test is running fine and the annotated method is getting picked up when running from my local machine but when we are running from Jenkins that specific error is thrown during pact:verify.
您必须将完整的 pact 文件夹放在项目的 Jenkins 工作区中。由于我们将契约合同保存在 src/test/resources/pacts
中,因此我们的 @PactFolder 值如下:
@PactFolder("src/test/resources/pacts")
已解决此问题。这是我们通过使用 -Dskiptests 跳过测试 类 来编译项目的时候。所以在此之后,当我们 运行 pact:verify 测试类路径不包含在搜索中时。
通过使用 mvn test-compile compile 编译测试 类 然后 运行 编译 pact:verify 来修复它。现在 类 每次都被捡起。
我有一个使用消息提供程序的项目,因为它涉及基于 Apache kafka 的消息传递。
消费者方面的 maven 目标在本地和 Jenkins 中都运行良好。
提供方协议验证在 Jenkins 中失败说 "No Annotated method found for interaction"。
我的 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>
在进行生产者端测试时,您需要提供 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"
},
编辑:
Problem here is the test is running fine and the annotated method is getting picked up when running from my local machine but when we are running from Jenkins that specific error is thrown during pact:verify.
您必须将完整的 pact 文件夹放在项目的 Jenkins 工作区中。由于我们将契约合同保存在 src/test/resources/pacts
中,因此我们的 @PactFolder 值如下:
@PactFolder("src/test/resources/pacts")
已解决此问题。这是我们通过使用 -Dskiptests 跳过测试 类 来编译项目的时候。所以在此之后,当我们 运行 pact:verify 测试类路径不包含在搜索中时。
通过使用 mvn test-compile compile 编译测试 类 然后 运行 编译 pact:verify 来修复它。现在 类 每次都被捡起。