JUnit-比较未知的Collection和ArrayList

时间:2018-10-23 20:43:37

标签: java list junit collections hamcrest

我想比较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方法?

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

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

请注意,您拥有的两行代码是相同的。您是不是要在第二行添加其他内容?

答案 2 :(得分:-1)

您可以使用Arrays.equals

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

这将检查数组的大小和项的累加。您的产品类应实现equals()才有意义。

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