所以我在Kent Beck的书测试驱动开发示例中完成了Money示例,并且能够让代码在他写的最后一次测试之前一直工作:
@Test
public void testPlusSameCurrencyReturnsMoney(){
Expression sum = Money.dollar(1).plus(Money.dollar(1));
assertTrue(sum instanceof Money);
}
这是调用的函数
public Expression plus(Expression addend) {
return new Sum(this, addend);
}
当我运行它时,它会给出java.lang.AssertionError,所以我的问题是它为什么会出现此错误以及如何解决它?
谢谢,任何帮助都表示赞赏,不,这不是作业...
答案 0 :(得分:4)
Lunivore已经回答了如何解决问题的问题,但我认为你应该在代码块(和测试)之前和之后重新阅读段落,如果你想更多地了解Beck试图解决的问题传达。
最后一句是“这是我们 必须修改以使其正常工作的代码:”。该代码块首先在第75页输入(带有测试用例)。第79页的最终结果没有任何改变。如果我们想要继续这项测试,它只是表明我们可以改变什么。
“当且仅当它是Money时,没有明显,干净的方法来检查参数的货币。实验失败,我们删除测试,然后离开我们去。”
他还说这个测试是丑陋的,并在下一页结束“尝试了一个简短的实验,然后在它没有成功时丢弃它。”
我写这篇文章只是为了以防你认为所有的例子都有效并且应该保留。
答案 1 :(得分:3)
您正在检查sum
变量是否为Money
,但在Sum
方法中返回plus
。
因此,除非Sum
是Money
的子类,否则该断言将始终失败。
要使其通过,您可能需要执行以下操作:
public Expression plus(Expression addend) {
return new Money(...<whatever>...);
}
当然,Money
也必须是Expression
。
或者您可能想要评估sum
以获取资金。或者甚至可以改为sum instanceof Sum
。这取决于你实际上想要实现的行为。