【问题标题】:Why does assertEquals(new Object[] {"abc"}, new Object[] {"abc"}); not fail?为什么 assertEquals(new Object[] {"abc"}, new Object[] {"abc"});不失败?
【发布时间】:2014-06-21 11:32:51
【问题描述】:

我正在关注 Kent Beck 的示例测试驱动开发。

相关章节可以在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"}) );

按预期打印 false...

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

【问题讨论】:

    标签: java arrays junit tdd equals


    【解决方案1】:

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

    我怀疑 Kent 在 JUnit 有这种有用的行为之前写了那本书的部分内容。 (事实上​​,我希望这本书早于存在的超载。)

    【讨论】:

      【解决方案2】:

      如果您查看 assertEquals 的源代码,您会发现它对数组进行了重载,并且对它们进行了专门的相等性测试:

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

      原来如此:

      1. 测试它们的大小是否匹配
      2. 测试每个元素是否相等

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 1970-01-01
        • 2011-07-13
        • 2014-02-10
        • 2018-09-03
        • 2012-03-10
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多