JUnit - 比较未知集合和数组列表



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

由于您使用的是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");

假设您使用的数据类型已经具有 equals 方法,则无需检查(未(实现的equals()函数。否则,您必须创建一些比较您正在使用的数据的内容。

附带说明一下,您拥有的两行代码是相同的。你的意思是在第二行放别的东西吗?

您可以使用Arrays.equals

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

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

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

最新更新