【发布时间】:2009-02-13 02:07:27
【问题描述】:
我是 TDD 的忠实拥护者,这些天来我的大部分开发工作都使用它。但是,我经常遇到的一种情况,并且从未找到我认为是“好”的答案,类似于以下(人为的)示例。
假设我有一个像这样的接口(用 Java 编写,但实际上,这适用于任何 OO 语言):
public interface PathFinder {
GraphNode[] getShortestPath(GraphNode start, GraphNode goal);
int getShortestPathLength(GraphNode start, GraphNode goal);
}
现在,假设我要创建此接口的三个实现。我们称它们为DijkstraPathFinder、DepthFirstPathFinder 和AStarPathFinder。
问题是,如何使用 TDD 开发这三个实现?它们的公共接口将是相同的,并且大概我会为每个接口编写相同的测试,因为 getShortestPath() 和 getShortestPathLength() 的结果在所有三个实现中应该是一致的。
我的选择似乎是:
在我编写第一个实现的代码时,针对
PathFinder编写一组测试。然后“盲目”编写其他两个实现并确保它们通过PathFinder测试。这似乎不对,因为我没有使用 TDD 来开发后两个实现类。以测试优先的方式开发每个实现类。这似乎不对,因为我将为每个类编写相同的测试。
结合以上两种技术;现在我有一组针对接口的测试和一组针对每个实现类的测试,这很好,但是测试都是一样的,这不好。
这似乎是一种相当普遍的情况,尤其是在实现策略模式时,当然实现之间的差异可能不仅仅是时间复杂度。其他人如何处理这种情况?是否有针对我不知道的接口进行测试优先开发的模式?
【问题讨论】:
标签: language-agnostic tdd polymorphism