为什么assertEquals(new int [] {1},new int [] {1})会导致失败?

时间:2014-02-21 13:43:00

标签: java unit-testing junit equals

我正在测试我的洗牌课,遇到了一个我无法理解的问题。为什么以下assert声明:

assertEquals(new int[]{1}, new int[]{1}); 

会产生AssertionError?当然,正确的答案是“因为他们不平等!”,但有人能解释我为什么吗?以及如何测试一个方法,我希望两个这样的对象相等?

3 个答案:

答案 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等于方法。

另请参阅:equals vs Arrays.equals in Java

答案 2 :(得分:1)

因为您创建了2个不同的对象,并且它们指向内存中的不同位置。 比较对象时,使用从Object类继承的equals()方法。现在,如果您不重写类中的方法,您将拥有默认行为,即对象地址的比较。在代码中,您创建了2个数组,但即使它们的内容相同,也不会测试内容是否相等,而是使用Object类中的继承equals()方法引用对象。