我有一个用TDD开发的非常重要的服务对象.它从一个简单的任务开始:对于队列中的对象,构造异步处理的尝试.所以我围绕我的constructAttempt()方法编写了一个测试:
void constructAttempt() {...}
有许多可能需要考虑的场景,所以我对这种方法进行了十几次测试.
然后我实现了我真正需要它做的事情:扫描整个队列并构建一批尝试.所以代码看起来更像:
public void go() { for (QueuedItem item : getQueuedItems()) { constructAttempt(item); } }
最后我发现我需要一些预处理,有时可能会影响constructAttempt().现在代码看起来更像:
public void go() { preprocess(); for (QueuedItem item : getQueuedItems()) { constructAttempt(item); } }
我对现在应该做些什么有些怀疑.
我应该保持代码不变,使用constructAttempt(),preprocess()和go()独立测试?为什么不是/为什么不呢?我冒险不承担预处理和破坏封装的副作用.
或者我应该重构整个测试套件只调用go()(这是唯一的公共方法)?为什么不是/为什么不呢?这会使测试更加模糊,但另一方面,它会考虑所有可能的相互作用.事实上,它将成为仅使用公共API的黑盒测试,这可能与TDD不符.