使用JUnit轻松比较ArrayList是否相等的方法?

26

如何使用JUnit轻松比较ArrayList的相等性? 我需要实现相等接口吗?还是有一个简单的JUnit方法可以使其更容易?


可能是 Assert List in Junit 的重复问题。 - djeikyb
3个回答

47
您无需为列表相等性做任何特殊处理,只需使用assertEquals即可。
ArrayList和其他列表通过检查列表中相应位置上的所有对象是否相等,并使用对象的equals()方法来实现equals()。因此,您可能需要检查列表中的对象是否正确实现了equals()。

这个答案的问题在于它在失败时不会报告列表的内容。尝试使用assertThat(a,is(b));代替。starblue关于实现equals的警告仍然存在。另请参见重复问题3236880:那里有更好的答案和代码示例。 - Barett
来自未来的更新:这似乎不适用于基本类型的数组,而且无论如何,assertEquals(Object [],Object [])都已过时。请使用assertArrayEquals。 - johncip
@johncip 这是关于数组的好建议,但问题是关于ArrayList的。 - starblue
糟糕!我正在查看一些关于数组相等性的问题,但不知怎么搞的,这个混进来了。应该更仔细地阅读。在那种情况下,你对于arrayEquals是正确的,显然。 - johncip

5

您可能想查看List.equals的文档。


这是否意味着如果我有一个List<SomeObject>,我需要为SomeClass覆盖equals方法? - Alex Baranosky
6
它将使用Object.equals比较列表的元素。默认情况下,如果它们是相同的实例,则为true。如果你想允许具有相同内部数据的不同对象匹配,则它们应该提供一个带有equals(和hashCode)方法的SomeClass - Tom Hawtin - tackline

2
我认为这可能是一个过于简单的答案(尽管它是正确的)。测试ArrayLists是否相等意味着您已经考虑了元素的相等性。如果元素是整数,那就没问题了。但是,如果它们是您自己的域类的实例,则应该让您了解与相等性(和克隆)相关的陷阱。请查看以下内容:http://www.artima.com/lejava/articles/equality.html,以获取有关实现相等性的一组好建议。此外:如果您需要克隆对象,请考虑使用复制构造函数而不是实现cloneable。Cloneable会引入一整套您可能没有预料到的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接