【发布时间】:2015-04-25 10:57:23
【问题描述】:
我们有一个任务 FooTask。我们正在创建一个 Foo 类,从业务登录的角度来看,它有 1 个责任。但事实证明,FooTask 真的很复杂。它由几个步骤/子任务组成,然后可以由类 Bar/Baz 责任来表示。这些类在 Foo 类之外没有真正的意义,它们不会单独使用。所以他们可能会有一个包范围或类似的东西。
假设你的 Foo 类,代表 FooTask 变成:
public class Foo {
private final Bar bar;
private final Baz baz;
// all-args constructor
public ReturnType doFooTask(InputParam input) {
final SubResult subresult = bar.doBarSubTask(input);
return baz.doBazSubTask(subresult);
}
}
现在,您将如何测试它?我看到两个选项,但不知道哪个更好:
1) 通过 Foo 的公共 API 测试类 Bar 和 Baz。 我看到了这种方法的一个主要流程:用于组合对象的子对象越多,到达的测试用例就越多。
2) 自己为类 Bar 和 Baz 编写完整的测试套件(它们是包私有的,所以只要我保持正确的测试包层次结构,我就可以毫无问题地测试它们)。
然后呢?我应该让我的 Foo 课程未经测试吗?我应该重复我的测试吗(这导致了我之前的问题——很多测试用例,更糟糕的是,复制粘贴)?或者也许我应该模拟出所有的依赖关系并断言,我在模拟上的正确方法是在调用 Foo 的方法时调用的?
【问题讨论】:
标签: unit-testing testing composition