【问题标题】:Money Example from Kent Beck's TDD by exampleKent Beck 的 TDD 中的金钱示例
【发布时间】:2011-10-10 17:12:25
【问题描述】:

因此,我已经完成了 Kent Beck 的书中 Test Driven Development by Example 中的 Money 示例,并且能够让代码正常工作,直到他编写的最后一个测试:

@Test
public void testPlusSameCurrencyReturnsMoney(){
    Expression sum = Money.dollar(1).plus(Money.dollar(1));
    assertTrue(sum instanceof Money);
}

这是 this 调用的函数

public Expression plus(Expression addend) {
    return new Sum(this, addend);
}

当我运行它时,它会给出java.lang.AssertionError,所以我的问题是它为什么会给出这个错误以及如何解决它?

【问题讨论】:

  • 你有这个异常的堆栈跟踪吗?
  • Expression 是否扩展 Money
  • @TomaszNurkiewicz no Expression 是一个包含以下行的接口:'Money reduce(Bank bank, String to);表达式加(表达式加数);表达式时间(整数乘数);'
  • @StuperUser 我不知道如何得到它,但单元测试只是在 assertTrue(...) 行停止,它只是显示断言错误。

标签: java unit-testing tdd


【解决方案1】:

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

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

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

他还表示这个测试很丑,并在下一页总结“尝试了一个简短的实验,然后在没有成功时将其丢弃”。

我写这个只是为了以防你认为所有的例子都可以工作并且应该保留。

【讨论】:

    【解决方案2】:

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

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

    要让它通过,您可能需要执行以下操作:

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

    当然,Money 也必须是 Expression

    或者您可能想要评估sum 以从中获利。或者甚至可以改用sum instanceof Sum。这取决于您实际尝试实现的行为。

    顺便说一句,beware the instanceof operator.

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 2020-11-30
      • 2010-10-24
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多