为什么assertEquals(new Object [] {" abc"},new Object [] {" abc"});没有失败?

时间:2014-05-05 08:14:05

标签: java arrays junit tdd equals

我跟随肯特贝克的测试驱动开发实例。

相关章节可以在a preview online here找到。

肯特写道:

  

我们可以使用包含两种货币的双元素数组作为关键字吗? Array.equals()是否检查元素是否相等?

public void testArrayEquals() {
   assertEquals(new Object[] {"abc"}, new Object[] {"abc"});
}
  

不。测试失败,因此我们必须为密钥

创建一个真实对象

然而,当我运行测试时,它会通过。

我认为assertEquals会检查Array.equals(),它检查相同的对象而不是内容,因此测试会失败,但它不会(至少不适合我)。

另一方面:

System.out.println( new Object[]{"abc"}.equals(new Object[]{"abc"}) );

按预期打印错误...

Eclipse告诉我,assertEquals(Object [],Object [])现在已被弃用,但为了理解,为什么测试现在传递给我?

2 个答案:

答案 0 :(得分:5)

数组不会覆盖equals,因此您可以获得引用相等 - 这就是您的System.out.println调用正在打印false的原因。但是,JUnit的方法断言数组逻辑相等,即它们的大小相同,并且它们中的每个元素对相等。当您编写涉及数组的测试时,这几乎总是您想要的

我怀疑肯特在JUnit有这种有用的行为之前写了那本书。 (事实上​​,我希望这本书能够超越现有的超载。)

答案 1 :(得分:1)

如果你看一下assertEquals的源代码,你会发现它为数组重载并且它为它们做了专门的相等测试:

https://android.googlesource.com/platform/external/junit/+/android-4.2.1_r1/src/org/junit/internal/ComparisonCriteria.java

所以:

  1. 测试其尺寸是否匹配
  2. 测试每个元素是否相等