0

当使用 @assertThat(hasSize(x))@ 形式的 hasSize 匹配器和返回数组的 jsonpath 表达式时,将不会考虑重复值。例子 :

{
        "a":[
        {
        "value1":"ab",
        "value2": 2
        },
        {
        "value1":"ab",
        "value2":2
        }
        ]
}

如果我执行 payload().validate("$..value1", "@assertThat(hasSize(2))@") 它将导致错误,因为 hasSize 将期望一个大小为 1 而不是 2 的集合。这是匹配器的期望行为?一种解决方法是使用表达式“$.a[?(@.value1)]”。

4

1 回答 1

0

概括

这是 Citrus 中的一个错误。正如我在评论中提到的,我已经找到了这个错误,请参阅GitHub 问题

我还修复了这个错误并打开了一个GitHub Pull Request。但是,Citrus 的主要维护者可能需要几周的时间来审核我的更改,因为他目前正在从事不同的项目。

我很肯定该修复程序将包含在下一个 Citrus 维护版本2.7.3中。

笔记

仅当某些值是重复条目时才会出现此错误,因为代码片段使用 a Set,根据定义,它不能保存重复条目。

示例(从 GitHub 问题复制)

{
  "test_array": [
    {
      "key_with_identical_values": "identical_value",
      "key_with_unique_values": "unique_value"
    },
    {
      "key_with_identical_values": "identical_value",
      "key_with_unique_values": "different_unique_value"
    }
  ]
}

鉴于 Citrus 验证如下:

<receive endpoint="testServer">
  <message type="json">
    <validate>
      <json-path expression="$..key_with_unique_values" value="@assertThat(hasSize(2))@"/>
      <json-path expression="$..key_with_identical_values" value="@assertThat(hasSize(2))@"/>
    </validate>
  </message>
</receive>

即使两个表达式的 JSONPath 数组的大小为2(["unique_value", "different_unique_value"]和),对于带有消息["identical_value", "identical_value"]的表达式,验证也会失败:$..key_with_identical_values

Expected: a collection with size <2>
     but: collection size was <1>
于 2017-08-04T14:18:12.680 回答