对于如何为重构组成其他类的类编写测试感到困惑

时间:2014-12-09 14:22:32

标签: unit-testing tdd

我没有广泛或彻底地阅读TDD,但我觉得我知道基础知识。

TDD的一个方面是你首先编写测试。对于Calculator程序,可能有一个测试用例如下:

public class CalculatorTest {
    public void shouldSumOneAndOneCorrectly() {
        Calculator calc = new Calculator();
        calc.push(new Number(1));
        calc.push(new SumOperator());
        calc.push(new Number(1));
        Number sum = calc.equals();
        assert(sum.equals(new Number(2)));
    }
}

如果我在编写任何实现之前编写上述测试,那么我就遇到了这个问题:我是在测试Calculator类是否正确,或者我应该测试Number类是否正确总和?当然,这是假设Calculator类将在其实现的某个地方调用number.add(number)函数。但是我认为你在编写测试时不应该考虑实现?

如果我开始为Calculator类编写测试,然后在实现过程中,意识到我的Calculator类只是委托和协调组合对象,那么我是否为这些组合对象编写测试?我是否保留计算器测试?

您是否开始在非常高的级别编写测试(计算器),然后在实现功能和创建组合类时,为这些类编写更多测试?

我希望我有所作为。

1 个答案:

答案 0 :(得分:2)

我首先关注的是行为。

您希望Calculator课程能够添加2个数字。如果你通过其他类来做这个(相当)无关紧要,因为这是计算器的实现细节。如果您在那里实现了功能,那么您的测试应该覆盖Number类。

如果您认为Number类的功能在Calculator之外是通用的(并且不再是实现细节),那么我就会考虑这一点分别为Number类编写基于行为的测试,但在此之前,我将依赖于Calculator行为的测试。

对我来说,这类似于公共方法的测试,该方法委托私有方法来完成工作。您不想为私有方法编写测试,因为它们应该被公共方法行为的测试所覆盖。