使用 PACT-builder 时如何向 PACT 添加匹配规则?

问题描述

在消费者驱动的测试中使用消费者的 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()
   }