【问题标题】:Why Hamcrest's containsInAnyOrder matcher accepts array and not a list?为什么 Hamcrest 的 containsInAnyOrder 匹配器接受数组而不是列表?
【发布时间】:2018-09-04 11:25:27
【问题描述】:

在使用 Rest Assured 断言 REST 响应时,我正在使用 Hamcrest 的 containsInAnyOrder 匹配器。这是我的断言的一个例子:

assertThat(
        body.jsonPath().getList("zones.name"),
        containsInAnyOrder(values.getName().toArray()));

第一个参数返回一个列表。第二个参数 (values.getName()) 也返回一个列表。但是 Intellij IDEA 在 mactcher 上显示错误:Unchecked generics array creation for varargs parameter。当我运行这个断言时,我得到java.lang.AssertionError。当我将第二个参数转换为数组时,例如values.getName().toArray(),我得到了一切按预期工作。

所以我不明白为什么将 List 与 List 进行比较不起作用,但 List 与数组进行比较呢?为什么我需要将第二个参数转换为数组?

【问题讨论】:

    标签: rest-assured hamcrest


    【解决方案1】:

    containsInAnyOrder 接受 T...

    当您传递List 时,您不会将body.jsonPath().getList("zones.name") 中的元素与values.getName() 中的元素进行比较,而是与包含列表本身的单元素数组进行比较。由于字符串不能等于列表,因此断言失败。

    【讨论】:

    • 感谢您的回答。抱歉,我无法理解这句话:包含列表本身的单元素数组。你能解释一下吗?
    • 假设您有一个包含"a""b" 的列表。当你将它作为参数传递时,你不会得到一个带有["a", "b"] 的数组,而是一个带有[list("a", "b")] 的数组
    • 但是如果我检查一个实际结果是body.jsonPath().getList("zones.name") 中的一个列表,为什么预期的结果应该是一个数组而不是同一个列表?
    【解决方案2】:

    因为Matchers中有Collection

    public static <T> Matcher<java.lang.Iterable<? extends T>> containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
    

    您可以使用containsInAnyOrder(equalTo("bar"), equalTo("foo")) 之类的东西,但它不是那么方便。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多