当前位置: 首页 > 知识库问答 >
问题:

是否为可能的空数组定义合同?

戴鸿羲
2023-03-14
org.springframework.cloud.contract.spec.Contract.make {
    request {
        method 'GET'
        url $(client(~/\/categories\?publication=[a-zA-Z-_]+?/), server('/categories?publication=DMO'))
    }
    response {
        status 200
        headers {
            header('Content-Type', 'application/json;charset=UTF-8')
        }
        body """\
            [{
                "code": "${value(client('DagKrant'), server(~/[a-zA-Z0-9_-]*/))}",
                "name": "${value(client('De Morgen Krant'), server(~/[a-zA-Z0-9_\- ]*/))}",
                "sections" : []
            },
            {
                "code": "${value(client('WeekendKrant'), server(~/[a-zA-Z0-9_-]*/))}",
                "name": "${value(client('De Morgen Weekend'), server(~/[a-zA-Z0-9_\- ]*/))}",
                "sections" : [
                    {
                    "id" : "${value(client('a984e824'), server(~/[0-9a-f]{8}/))}",
                    "name" : "${value(client('Binnenland'), server(~/[a-zA-Z0-9_\- ]*/))}"
                    }
                ]
            }]
        """
    }
}
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).array().contains("code").matches("[a-zA-Z0-9_-]*");
assertThatJson(parsedJson).array().array("sections").contains("id").matches("([0-9a-f]{8})?");
assertThatJson(parsedJson).array().array("sections").contains("name").matches("[a-zA-Z0-9_\\- ]*");
assertThatJson(parsedJson).array().contains("name").matches("[a-zA-Z0-9_\\- ]*");
Parsed JSON [[{"code":"WeekendKrant","name":"De Morgen Weekend","sections":[]}]] 
doesn't match the JSON path [$[*].sections[*][?(@.id =~ /([0-9a-f]{8})?/)]]

我还尝试使用了optional(),但唯一的区别是regex包含了一个‘?’在最后。JSON断言仍然失败。

在存根中,两个结果都返回,但对于测试,我希望测试也能成功。测试断言纯粹是在每个属性的最后一次出现时生成的吗?难道没有可能在数组上使用类似'optional()'的东西吗?

共有1个答案

方璞
2023-03-14

在版本1.0.3之前,不可能进行类似的额外检查。由于该版本,您可以提供更多的匹配器-http://cloud.spring.io/spring-cloud-static/spring-cloud-contract/1.0.3.release/#_dynamic_properties_in_matchers_sections。您可以使用与大小相关的附加检查来匹配bytype

摘自文件

目前,我们只支持具有以下匹配可能性的基于JSON路径的匹配器。对于Stubmatchers:

byTimestamp()-通过提供的JSON路径从响应中获取的值需要与ISO日期时间的regex匹配

byTime()-通过提供的JSON路径从响应中获取的值需要匹配ISO时间的regex

对于TestMatchers:

byTimestamp()-通过提供的JSON路径从响应中获取的值需要与ISO日期时间的regex匹配

byTime()-通过提供的JSON路径从响应中获取的值需要匹配ISO时间的regex

byType()-通过提供的JSON路径从响应中获取的值需要与契约中的响应正文中定义的类型相同。byType可以在其中设置minEccurrence和maxEccurrence。这样就可以断言集合的大小。

Contract contractDsl = Contract.make {
request {
    method 'GET'
    urlPath '/get'
    body([
            duck: 123,
            alpha: "abc",
            number: 123,
            aBoolean: true,
            date: "2017-01-01",
            dateTime: "2017-01-01T01:23:45",
            time: "01:02:34",
            valueWithoutAMatcher: "foo",
            valueWithTypeMatch: "string"
    ])
    stubMatchers {
        jsonPath('$.duck', byRegex("[0-9]{3}"))
        jsonPath('$.duck', byEquality())
        jsonPath('$.alpha', byRegex(onlyAlphaUnicode()))
        jsonPath('$.alpha', byEquality())
        jsonPath('$.number', byRegex(number()))
        jsonPath('$.aBoolean', byRegex(anyBoolean()))
        jsonPath('$.date', byDate())
        jsonPath('$.dateTime', byTimestamp())
        jsonPath('$.time', byTime())
    }
    headers {
        contentType(applicationJson())
    }
}
response {
    status 200
    body([
            duck: 123,
            alpha: "abc",
            number: 123,
            aBoolean: true,
            date: "2017-01-01",
            dateTime: "2017-01-01T01:23:45",
            time: "01:02:34",
            valueWithoutAMatcher: "foo",
            valueWithTypeMatch: "string",
            valueWithMin: [
                1,2,3
            ],
            valueWithMax: [
                1,2,3
            ],
            valueWithMinMax: [
                1,2,3
            ],
    ])
    testMatchers {
        // asserts the jsonpath value against manual regex
        jsonPath('$.duck', byRegex("[0-9]{3}"))
        // asserts the jsonpath value against the provided value
        jsonPath('$.duck', byEquality())
        // asserts the jsonpath value against some default regex
        jsonPath('$.alpha', byRegex(onlyAlphaUnicode()))
        jsonPath('$.alpha', byEquality())
        jsonPath('$.number', byRegex(number()))
        jsonPath('$.aBoolean', byRegex(anyBoolean()))
        // asserts vs inbuilt time related regex
        jsonPath('$.date', byDate())
        jsonPath('$.dateTime', byTimestamp())
        jsonPath('$.time', byTime())
        // asserts that the resulting type is the same as in response body
        jsonPath('$.valueWithTypeMatch', byType())
        jsonPath('$.valueWithMin', byType {
            // results in verification of size of array (min 1)
            minOccurrence(1)
        })
        jsonPath('$.valueWithMax', byType {
            // results in verification of size of array (max 3)
            maxOccurrence(3)
        })
        jsonPath('$.valueWithMinMax', byType {
            // results in verification of size of array (min 1 & max 3)
            minOccurrence(1)
            maxOccurrence(3)
        })
    }
    headers {
        contentType(applicationJson())
    }
}
}
assertThat((Object) parsedJson.read("$.valueWithMin")).isInstanceOf(java.util.List.class);
assertThat(parsedJson.read("$.valueWithMin", java.util.Collection.class).size()).isGreaterThanOrEqualTo(1);
assertThat((Object) parsedJson.read("$.valueWithMax")).isInstanceOf(java.util.List.class);
assertThat(parsedJson.read("$.valueWithMax", java.util.Collection.class).size()).isLessThanOrEqualTo(3);
assertThat((Object) parsedJson.read("$.valueWithMinMax")).isInstanceOf(java.util.List.class);
assertThat(parsedJson.read("$.valueWithMinMax", java.util.Collection.class).size()).isStrictlyBetween(1, 3);
 类似资料:
  • 问题内容: 在Objective-C中,当我有一个数组时 我想检查它是否不为空,我总是这样做: 这样一来,无需检查是否会因为这种情况将导致代码陷入错误,并且非空数组也会这样做。 但是,在Swift中,我偶然发现了一个可选数组: 而且我无法确定要使用哪种条件。我有一些选择,例如: 选项A:在相同条件下检查非用例和空用例: 选项B: 使用解除绑定数组: 选项C: 使用Swift提供的合并运算符: 我不

  • 我正在寻找性能最友好的方法来检查数组中的所有值是否为null,或者是否至少有一个元素具有其他类型。 也就是说,我需要一个方法,它根据传递的数组返回布尔值 例如:

  • 当页面第一次加载时,我需要检查中是否有图像,并加载最后一个图像。 否则,我禁用预览按钮,提醒用户按下新图像按钮,并创建一个空数组来放置图像; 问题是中的

  • 问题内容: 我有的: 我有jQuery AJAX函数,可在查询数据库后返回HTML。根据查询结果,该函数将返回HTML代码,或者根据需要返回任何内容(即空白)。 我需要的: 我需要有条件地检查数据何时为空。 我的代码: 我的问题: 我尝试了多种条件,但都无法正确检查数据。根据我的发现,警告消息为空并不表示数据是 空的 不存在的 等于零 长度为零 空值 未定义 如果这些都不是,那么我该如何有条件地检

  • 在结构中相同类型的连续成员之间的指针算术曾经是一种常见做法,而指针算术仅在数组中有效。在C中,它将是显式的未定义行为,因为数组只能由声明或新表达式创建。但是C语言将数组定义为连续分配的非空对象集,具有特定的成员对象类型,称为元素类型。(N1570 草案为 C11,6.2.5 类型 §20)。因此,如果我们可以确保成员是连续的(意味着它们之间没有填充),那么将其视为数组可能是合法的。 下面是一个简化

  • 问题内容: 我正在尝试检查数组数组是否包含字符串数组。我的错误消息说: “无法为’contains’找到重载,该重载接受类型为’([([[((String)])]),[(String)])类型的参数列表 这是怎么回事!? 问题答案: 不符合协议,因此 不能在这里使用。您可以使用基于谓词的变体 代替: 因为是为元素数组定义的。