我是TDD的忠实粉丝,现在在大部分开发工作中都使用它。但是有一种情况我经常遇到,却从未找到一个我认为“好”的答案,就像下面这个(编造的)例子。
假设我有一个接口,像这样(用Java写的,但实际上,适用于任何OO语言):
public interface PathFinder {
GraphNode[] getShortestPath(GraphNode start, GraphNode goal);
int getShortestPathLength(GraphNode start, GraphNode goal);
}
现在,假设我想创建这个接口的三个实现。我们称它们为DijkstraPathFinder、DepthFirstPathFinder和AStarPathFinder。
问题是,我如何使用TDD开发这三种实现?它们的公共接口将是相同的,并且我会为每个编写相同的测试,因为getShortestPath()和getShortestPathLength()的结果应在所有三个实现中保持一致。
我的选择似乎是:
1. 在编写第一个实现时,针对PathFinder编写一组测试。然后“盲目”编写另外两个实现,并确保它们通过PathFinder测试。这似乎不正确,因为我没有使用TDD来开发第二和第三个实现类。 2. 以测试优先的方式开发每个实现类。这似乎不正确,因为我将为每个类编写相同的测试。 3. 将上述两种技术结合起来;现在我有一组针对接口的测试和一组针对每个实现类的测试,这很好,但测试都是相同的,这不好看。
这似乎是一个相当常见的情况,特别是在实现策略模式时,当然,实现之间的差异可能不仅仅是时间复杂度。其他人如何处理这种情况?是否有一种针对接口的测试优先开发模式,我不知道?