来自肯特贝克的TDD的钱例子

时间:2011-10-10 17:12:26

标签: java unit-testing tdd

所以我在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,所以我的问题是它为什么会出现此错误以及如何解决它?

谢谢,任何帮助都表示赞赏,不,这不是作业...

2 个答案:

答案 0 :(得分:4)

Lunivore已经回答了如何解决问题的问题,但我认为你应该在代码块(和测试)之前和之后重新阅读段落,如果你想更多地了解Beck试图解决的问题传达。

最后一句是“这是我们 必须修改以使其正常工作的代码:”。该代码块首先在第75页输入(带有测试用例)。第79页的最终结果没有任何改变。如果我们想要继续这项测试,它只是表明我们可以改变什么。

“当且仅当它是Money时,没有明显,干净的方法来检查参数的货币。实验失败,我们删除测试,然后离开我们去。”

他还说这个测试是丑陋的,并在下一页结束“尝试了一个简短的实验,然后在它没有成功时丢弃它。”

我写这篇文章只是为了以防你认为所有的例子都有效并且应该保留。

答案 1 :(得分:3)

您正在检查sum变量是否为Money,但在Sum方法中返回plus

因此,除非SumMoney的子类,否则该断言将始终失败。

要使其通过,您可能需要执行以下操作:

public Expression plus(Expression addend) {
    return new Money(...<whatever>...);
}

当然,Money也必须是Expression

或者您可能想要评估sum以获取资金。或者甚至可以改为sum instanceof Sum。这取决于你实际上想要实现的行为。

顺便说一句,beware the instanceof operator.