假设我写了一个名为ValueFinder
的非常简单的类,如下所示:
public class ValueFinder {
public String findValue(Object obj) {
String value = null;
value = findValueFirstWay(obj);
if (value == null) {
value = findValueSecondWay(obj);
}
return value;
}
protected String findValueFirstWay(Object obj) {
....
}
protected String findValueSecondWay(Object obj) {
....
}
}
现在我想测试findValueFirstWay
是否是调用findValue
时尝试的第一种方法。这是一个非常简单的类,“算法”的方式非常简单。如果没有进行部分模拟,findValueFirstWay
和findValueSecondWay
被模拟并且findValue
被单独存在,我该如何测试呢?
我认为我应该重构这个类,以便findValueFirstWay
和findValueSecondWay
在一个单独的类或类中?对于这么简单的事情,这似乎是不必要的工作。
答案 0 :(得分:2)
你可以完全避免嘲笑,并通过真实物体的可见效果来测试它。
或者你可以模拟作为值传入的对象,并期望findValueFirstWay(Object obj)
对obj
进行的任何调用都会导致它返回null等等。
然而,即使看起来很简单,我的第一个冲动仍然是将问题方法提取到一个或两个单独的类,以便可以使用模拟更自然地测试交互。
答案 1 :(得分:1)
我同意。您可以使用策略模式并为每种方式定义策略类,但在这种简单的情况下似乎有点过分。我没有看到使用部分模拟来测试它的错误。
答案 2 :(得分:0)
为什么不简单地为您的测试创建子类ValueFinder
并覆盖两个受保护的方法?通过这种方式,您可以跟踪已调用的顺序(使用标志,变量,...),而无需将方法移动到其他位置。虽然这会是某种“部分嘲弄”,不是吗?