问题描述
在消费者驱动的测试中使用消费者的 PACT-builder,我尝试构建一个契约并将契约生成为 json 文件(默认在目标文件夹中)。
@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "foo-provider")
class FooContract {
@Pact(consumer = "foo-consumer")
RequestResponsePact createPact(PactDslWithProvider builder) {
return builder.given("A server error")
.uponReceiving("Get all Foos")
.path("/foos")
.willRespondWith()
.status(500)
.body("{"title":"Internal Server Error"}")
.toPact()
}
@Test
void getAllFoos(MockServer mockServer) throws IOException,URISyntaxException {
var HttpResponse response = Request.Get(new URIBuilder(mockServer.getUrl() + "/foos").build()).execute().returnResponse();
assertthat(response.getStatusLine().getStatusCode()).isEqualTo(500);
}
}
它会生成一个包含以下内容的文件,不包括我想要进入的 matchingRules
块:
{
"provider": {
"name": "foo-provider"
},"consumer": {
"name": "foo-consumer"
},"interactions": [
{
"description": "A server error","request": {
"method": "GET","path": "/foos"
},"response": {
"status": "GET","body": {
"title": "Internal Server Error"
},"matchingRules": {
"$.body.title": {
"match": "type"
}
}
}
}
]
}
你知道如何在文件中包含这些匹配规则吗?因为,它们受到框架的支持,并且当添加时,比如说,手动添加,提供者端测试实现会识别它并且它可以工作。
我使用以下依赖项/版本:
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-consumer-junit5</version>
<version>4.0.10</version>
<scope>test</scope>
</dependency>
解决方法
您可以使用 matchers 获得匹配规则。目前,您正在传递一个硬编码的 JSON,因此 Pact 不知道哪些位应该有匹配器,哪些应该逐字测试。
在你的情况下,这将是这样的:
PactDslJsonBody body = new PactDslJsonBody()
.stringType("title","Internal server error");
然后你可以像这样传递它:
@Pact(consumer = "foo-consumer")
RequestResponsePact createPact(PactDslWithProvider builder) {
return builder.given("A server error")
.uponReceiving("Get all Foos")
.path("/foos")
.willRespondWith()
.status(500)
.body(body)
.toPact()
}