当我从 IDE 执行提供程序测试时@State执行方法,但 mvn pact:verify 命令不执行提供程序的@State
提供程序测试类:
@RunWith(PactRunner.class)
@Provider("wProvider")
@PactFolder("/home/username/workspace/automation/pactProject/pacts/")
public class WpproviderTest {
@State("wProvider will create new stuff")
public void providerState(){
System.out.println("execute the the provider state");
//some code...
System.out.println("your new stuff response is: " + jsonResponse)
}
@TestTarget
public final Target target = new HttpTarget(url, true);
@TargetRequestFilter
public void updateAuthHeaders(HttpRequest request) {
request.addHeader("some auth headers")
}
}
我的pom.xml文件:
<plugin>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-provider-maven_2.12</artifactId>
<version>3.6.7</version>
<configuration>
<serviceProviders>
<serviceProvider>
<name>wProvider</name>
<requestFilter>
request.addHeader('Authorization', 'auth value')
</requestFilter>
<stateChangeRequestFilter>
request.addHeader('Authorization', 'auth value')
</stateChangeRequestFilter>
<stateChangeUrl>http://mywebsite.com/myservice/myaction
</stateChangeUrl>
<stateChangeUsesBody>true</stateChangeUsesBody>
<protocol>http</protocol>
<host>http://localhost</host>
<path></path>
<port>443</port>
<pactBroker>
<url>https://mypactbroker</url>
<authentication>
<username>my_usrname</username>
<password>my_pwd</password>
</authentication>
</pactBroker>
<insecure>true</insecure>
</serviceProvider>
</serviceProviders>
</plugin>
我的契约文件:
{
"provider": {
"name": "wProvider"
},
"consumer": {
"name": "tConsumer"
},
"interactions": [
{
"description": "A new interaction with wProvider",
"request": {
"method": "POST",
"path": "/somePath",
"headers": {
"Content-Type": "application/json"
},
"body": ""
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"body": " ",
"matchingRules": {
"body": {
// some matching rules
}
}
},
"providerStates": [
{
"name": "wProvider will create new stuff"
}
]
}
],
"metadata": {
"pactSpecification": {
"version": "3.0.0"
},
"pact-jvm": {
"version": "3.6.7"
}
}
}
当我执行 mvn 协议:验证 -X 命令时,我在控制台中看到:
鉴于Wprovider将产生新的东西
[调试] 调用的状态更改 http://mywebsite.com/myservice/myaction -> HTTP/1.1 200 OK [DEBUG] 状态更改:"ProviderState(name=http://mywebsite.com/myservice/myaction, params={}(" -> Ok(value={}(
我缺少一些与 mvn 协议@State相关的设置:验证?
看起来 Maven 插件不支持@State
注释(与 JUnit 设置不同(。
文档对此有以下说明:
对于每个提供程序,可以指定用于切换提供程序状态的状态更改 URL。此 URL 将在每次通过 POST 进行交互之前从 pact 文件中接收提供程序状态描述和参数。
因此,您可能需要添加一个动态端点(例如 /_pact/state
(,可以接受请求并设置给定状态。
Maven插件(以及Gradle插件(在执行时对正在运行的提供程序执行Pact验证pact:verify
。您定义的@State
方法适用于 JUnit 测试。Maven插件不执行JUnit测试,您可以将它们作为Maven Surefire插件执行的test
Maven阶段的一部分运行。
Matt 上面提供的文档链接将让您知道如何使用 pact:verify
执行状态更改,但如果您编写了 JUnit 测试,则不需要使用它。