我试图断言以下集合的相等性:
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有什么方便的方法可以用来克服这个问题吗?
编辑:请注意,我想比较集合对象,而不是数组本身。
这就是哈姆克雷斯特来救援的地方。这是javadoc链接。我建议使用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));
关闭肥皂盒。
您可以使用Arrays#deepEquals
:
boolean isSameArrayContent = Arrays.deepEquals(coll1.toArray(), coll2.toArray());
assertTrue(isSameContent);