【问题标题】:JUnit - compare unknown Collection and ArrayListJUnit - 比较未知的 Collection 和 ArrayList
【发布时间】:2018-10-23 20:43:37
【问题描述】:

我想比较Collection(产品)(在我的例子中是LinkedHashMap$LinkedValues)和ArrayList

测试

assertThat(products, equalTo(Lists.newArrayList(product1, product2, product3)));

不起作用,因为 LinkedValues 没有实现 equals 方法。 所以我把我的测试改为:

  assertThat(new ArrayList<>(products), equalTo(Lists.newArrayList(product1, product2, product3)));

有没有更好的解决方案,我不必检查集合是否实现equals 方法?

【问题讨论】:

    标签: java list junit collections hamcrest


    【解决方案1】:

    由于您使用的是 Hamcrest,因此您应该使用名称稍有混淆的方法 Matchers.contains()。它检查目标集合是否包含与原始集合相同顺序的相同元素。

    给定

    Map<String, String> linkedHashMap = new LinkedHashMap<>();
    linkedHashMap.put("a", "A");
    linkedHashMap.put("b", "B");
    

    这会过去的:

    assertThat(linkedHashMap.values(), contains("A", "B"));
    

    这会失败:

    assertThat(linkedHashMap.values(), contains("B", "A"));
    

    请注意,Hamcrest 早已死去,尽管它运行良好并且适用于 99% 的使用,但您会对 AssertJ 的出色性能、提供的功能以及断言的简单程度感到震惊。

    使用 AssertJ:

    assertThat(linkedHashMap.values()).containsExactly("A", "B");
    

    【讨论】:

    • 嘿,我之前检查过contains,但正如你所说,我理解错了它的作用。感谢您推荐 AssertJ。我检查了它,它很棒:)
    【解决方案2】:

    假设您正在使用的数据类型已经有一个 equals 方法,则无需检查(未)实现的 equals() 函数。否则,您将不得不创建一些东西来比较您正在使用的数据。

    附带说明,您拥有的两行代码是相同的。您的意思是在第二行添加其他内容吗?

    【讨论】:

    • 行不应该相同。对不起,我错了。我编辑了帖子。
    • 太棒了;因此,就像 Mike 刚才所说的那样,您可以使用布尔表达式,例如 Arrays.equal,并确保它的计算结果始终为“真”。否则,对于像 ArrayList 这样的自定义对象,您需要定义自己的 equals 方法,无论是用于 ArrayList(我相信 Java 的 API 应该为此提供一些东西)还是对象本身。
    【解决方案3】:

    你可以使用Arrays.equals:

    assertTrue(Arrays.equals(products.toArray(), new Product[] {product1, product2, product3}));
    

    这会检查数组大小和项目的排序。您的产品类应该实现 equals() 才能有意义。

    请注意,如果需要,您可以使用ArrayList.toArray() 获取数组。

    【讨论】:

    • @AppiDevo 小错字,应该是equals,否则它可以工作。
    • 不是因为产品是Collection
    • 抱歉,我在您的帖子中错过了这一点。您应该可以先调用products.toArray(),然后使用该数组进行比较。
    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2015-06-02
    • 2017-08-30
    • 2017-06-25
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多