我正在测试我的洗牌课,遇到了一个我无法理解的问题。为什么以下assert
声明:
assertEquals(new int[]{1}, new int[]{1});
会产生AssertionError
?当然,正确的答案是“因为他们不平等!”,但有人能解释我为什么吗?以及如何测试一个方法,我希望两个这样的对象相等?
答案 0 :(得分:5)
但有人可以解释我为什么
当然 - 数组不会覆盖equals,因此它们会从Object
继承行为,其中任何两个不同的对象都是不相等的。
如果您使用0元素数组,它甚至比您显示的版本更简单:
System.out.println(new int[0].equals(new int[0])); // false
这就是为什么在非测试代码中检查相等性时使用Arrays.equals
,并且在检查测试代码中的相等性时,使用专用的assertXyz
方法(其中确切的方法取决于版本的JUnit等)。
答案 1 :(得分:3)
assertEquals
调用其中一个对象中的equals
对象,将其与另一个对象进行比较。
如果要对两个数组进行完全比较,则需要使用Arrays.equals()
比较数组,否则不幸的是它们只使用Object
等于方法。
答案 2 :(得分:1)
因为您创建了2个不同的对象,并且它们指向内存中的不同位置。 比较对象时,使用从Object类继承的equals()方法。现在,如果您不重写类中的方法,您将拥有默认行为,即对象地址的比较。在代码中,您创建了2个数组,但即使它们的内容相同,也不会测试内容是否相等,而是使用Object类中的继承equals()方法引用对象。