JUnit:使用参数化类型 - 数组断言集合的相等性

时间:2013-05-30 11:07:55

标签: java generics junit guava

我试图断言以下集合的相等性:

String[] arr1= new String[] { "1", "2", "3" };
Collection<String[]> coll1= Arrays.asList(arr1, arr1);

String[] arr2 = new String[] { "1", "2", "3" };
Collection<String[]> coll2 = Arrays.asList(arr2, arr2);

assertEquals(coll1, coll2);

然而,我得到了与预期相反的结果 - 一个断言错误。问题是使用Object.equals()方法检查数组是否相等,该方法实际检查明显不同的数组引用。

我可以使用JUnit或Guava中的方法来解决这个问题吗?

编辑:请注意,我想要比较集合对象,而不是数组本身。

2 个答案:

答案 0 :(得分:4)

这是Hamcrest来到rescque的地方。这是javadoc link。我建议使用IsArrayContainingInOrder

因此...

assertThat(coll1, IsArrayContainingInOrder.arrayContaining(coll2));
抱歉,以上内容适用于数组,但以下内容适用于集合...

assertThat(coll1, IsIterableContainingInOrder.contains(coll2.toArray()));

这使用IsIterableContainingInOrder

仅供参考,我发现使用Hamcrest匹配器如此优雅,以至于我很少使用非Hamcrest测试。所以我的所有测试都读起来像

assertThat(myValue, is(true));
assertThat(myValue, equalTo("something"));
assertThat(myList, IsIterableContainingInAnyOrder.containsInAnyOrder(first, second, third));

关闭肥皂盒。

答案 1 :(得分:3)

您可以使用Arrays#deepEquals

boolean isSameArrayContent = Arrays.deepEquals(coll1.toArray(), coll2.toArray());
assertTrue(isSameContent);