【问题标题】:Should the code from book work?书中的代码应该工作吗?
【发布时间】:2016-09-07 22:00:04
【问题描述】:

现在我正在阅读 Kent Beck 的“测试驱动开发”,但对“隐私”一章的理解存在问题。我使用 JUnit 4,这里是章节中的代码。

我们将测试的类:

public class Dollar {
    private int amount;

    Dollar(int amount) {
        this.amount = amount;
    }

    public Dollar times(int multiplier) {
        return new Dollar(amount * multiplier);
    }

    public boolean equals(Dollar d) {
        return amount == d.amount;
    }
}

测试(完全从书中复制):

public void testMultiplication() {
    Dollar five= new Dollar(5);
    assertEquals(new Dollar(10), five.times(2));
    assertEquals(new Dollar(15), five.times(3));
}

阅读一章我知道这个测试应该有效。但它不能工作,因为times 方法总是返回新对象,所以assertEqualss 总是会失败。

我的问题是:这个测试应该有效吗?或者它只是作为将其翻译成另一种编程语言的示例?

【问题讨论】:

  • 这种错误正是创建@Override注解的原因。

标签: java tdd


【解决方案1】:

来源:Junit API

assertEquals的源码说

/**
 * Asserts that two objects are equal. If they are not
 * an AssertionFailedError is thrown with the given message.
 */
static public void assertEquals(String message, Object expected, Object actual) {
    if (expected == null && actual == null) {
        return;
    }
    if (expected != null && expected.equals(actual)) {
        return;
    }
    failNotEquals(message, expected, actual);
}

当您调用 assertEquals 时,它会调用 Dollar 类上的 .equals

正如 Bohemian 所提到的,Object 类的 equals 方法的 @Override -> 提供了基于我们自定义实现进行检查的能力。

assertEquals(new Dollar(10), five.times(2));

.equals是按金额计算的,达到目的了。

【讨论】:

  • 澄清一下,需要的具体更改是实现equals(Object) 而不仅仅是equals(Dollar)。 @DevdattaK 建议让您的 IDE 生成 hashCodeequals 是正确执行此操作的快速方法。
【解决方案2】:

据我了解,这是行不通的,因为对象永远不会相等或完全相同。

我猜这本书是想给你一个笼统的概念,而不是一个准确的、完全正确的答案,尽管我仍然认为书中的例子应该是可用的。

【讨论】:

    【解决方案3】:

    似乎 assertEquals() 在调用 equals() 方法时存在一些问题。在调试时,发现由于某种原因,junit 库不是调用覆盖的 equals() 方法,而是通过反射找到正确的类定义来调用方法。它最终会比较 objs 的内存值。 然而,正如其他贡献者所指出的那样,Equals() 可以正常工作。

    【讨论】:

      【解决方案4】:

      就像 Kevin Grant 所说,它应该可以工作。

      由于您似乎只是在学习 JUnit,我只想补充一点,您应该始终覆盖类的 equals 方法。如果不这样做,则仅使用 assertEquals() 检查引用变量是否指向相同的内存地址。使用 Eclipse 时,您可以通过右键单击代码中的任意位置轻松地做到这一点 -> 源 -> 生成 hashCode() 和 equals()...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 2016-10-01
        • 2020-08-14
        • 1970-01-01
        • 2010-09-09
        相关资源
        最近更新 更多