Java Spring云契约验证程序测试生成不需要的断言

Java Spring云契约验证程序测试生成不需要的断言,java,spring-boot,yaml,spring-cloud-contract,Java,Spring Boot,Yaml,Spring Cloud Contract,我有以下YAML合同: request: method: GET url: /get response: status: 200 body: name: 'Name' code: '123' asOfDate: '1994-05-25T04:00:00.000Z' matchers: body: - path: "$[*].name" type: by_type - path: "$[*].code" t

我有以下YAML合同:

request:
  method: GET
  url: /get
response:
  status: 200
  body:
    name: 'Name'
    code: '123'
    asOfDate: '1994-05-25T04:00:00.000Z'
  matchers:
    body:
    - path: "$[*].name"
      type: by_type
    - path: "$[*].code"
      type: by_regex
      value: '[0-9]{3}'
    - path: "$[*].asOfDate"
      type: by_regex
      predefined: iso_date_time
这将生成以下测试代码:

        // and:
            DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
            assertThatJson(parsedJson).field("['code']").isEqualTo("123");
            assertThatJson(parsedJson).field("['asOfDate']").isEqualTo("1994-05-25T04:00:00.000Z");
            assertThatJson(parsedJson).field("['name']").isEqualTo("Name");
        // and:
            assertThat((Object) parsedJson.read("$[*].name")).isInstanceOf(java.util.List.class);
            assertThat((java.lang.Iterable) parsedJson.read("$[*].code", java.util.Collection.class)).allElementsMatch("[0-9]{3}");
            assertThat((java.lang.Iterable) parsedJson.read("$[*].asOfDate", java.util.Collection.class)).allElementsMatch("ignore");
我的问题是,我不希望契约强制代码完全匹配值(前三个断言)。我只希望合同生成最后三个断言(检查正确键入的断言)


YAML合同中是否有我写得不对的地方?值得注意的是,从响应主体中删除“asOfDate”会生成我想要的断言,但是如果删除“name”和“code”,则根本不会生成任何断言

我认为你走错了路。您应该编写
$.name
$.code
$.asOfDate
。然后SC Contract将从自动生成中删除这些条目。

如果您只想使用response->matchers->body中的检查,而不想使用response->body中的检查,您可以使用Marcin建议的技巧:

request:
  method: GET
  url: /get
response:
  status: 200
  body:
    name: $.name
    code: $.code
    asOfDate: $.asOfDate
  matchers:
    body:
    - path: "$[*].name"
      type: by_type
    - path: "$[*].code"
      type: by_regex
      value: '[0-9]{3}'
    - path: "$[*].asOfDate"
      type: by_regex
      predefined: iso_date_time
因此,您将不会有以下资产:

assertThatJson(parsedJson).field("['name']").isEqualTo("Name");
但仅限于:

assertThat(parsedJson.read("$[*].code", String.class)).matches("[0-9]{3}");

我的意思是,
matchers.body.path
条目是错误的<代码>[*]在jsonpath中表示数组。
response.body中没有数组。因此,应该有
$.name
而不是
$[*].name