书中的代码应该有效吗?

时间:2016-09-07 22:00:05

标签: java tdd

现在我正在阅读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方法总是返回新对象,因此assertEquals将始终失败。

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

4 个答案:

答案 0 :(得分: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时,它会调用.equals类上的Dollar

正如波希米亚人提到的,@Override - > equals类的Object方法可以根据我们的自定义实现进行检查。

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

.equals按金额计算,它解决了目的。

答案 1 :(得分:0)

根据我的理解,这不起作用,因为对象永远不会相同或完全相同。

我想这本书希望给你一个概括,而不是一个完全正确的答案,尽管我仍然认为书中的例子应该是可用的。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

凯文格兰特说,它应该有用。

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