我跟随肯特贝克的测试驱动开发实例。
相关章节可以在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 [])现在已被弃用,但为了理解,为什么测试现在传递给我?
答案 0 :(得分:5)
数组不会覆盖equals
,因此您可以获得引用相等 - 这就是您的System.out.println
调用正在打印false
的原因。但是,JUnit的方法断言数组逻辑相等,即它们的大小相同,并且它们中的每个元素对相等。当您编写涉及数组的测试时,这几乎总是您想要的。
我怀疑肯特在JUnit有这种有用的行为之前写了那本书。 (事实上,我希望这本书能够超越现有的超载。)
答案 1 :(得分:1)
如果你看一下assertEquals的源代码,你会发现它为数组重载并且它为它们做了专门的相等测试:
所以: