3

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

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 中使用任何方便的方法来克服这个问题吗?

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

4

2 回答 2

4

这就是 Hamcrest 进行救援的地方。这是 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));

离开肥皂盒。

于 2013-05-30T11:13:38.280 回答
3

你可以使用Arrays#deepEquals

boolean isSameArrayContent = Arrays.deepEquals(coll1.toArray(), coll2.toArray());
assertTrue(isSameContent);
于 2013-05-30T11:37:19.073 回答