现在我正在阅读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
将始终失败。
我的问题是:此测试应该有效吗?或者它只是作为一个示例将其转换为另一种编程语言?
答案 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()...