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

mal*_*rdz 3 java arrays tdd junit equals

我正在按照Kent Beck的测试驱动开发示例.

相关章节可在此处在线预览.

肯特写道:

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

public void testArrayEquals() {
   assertEquals(new Object[] {"abc"}, new Object[] {"abc"});
}
Run Code Online (Sandbox Code Playgroud)

不.测试失败,因此我们必须为密钥创建一个真实对象

但是,当我运行测试时它会通过.

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

另一方面:

System.out.println( new Object[]{"abc"}.equals(new Object[]{"abc"}) );
Run Code Online (Sandbox Code Playgroud)

按预期打印错误...

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

Jon*_*eet 5

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

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