在这种情况下你怎么不做部分嘲笑?

时间:2011-08-27 11:44:44

标签: java unit-testing mocking partial

假设我写了一个名为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时尝试的第一种方法。这是一个非常简单的类,“算法”的方式非常简单。如果没有进行部分模拟,findValueFirstWayfindValueSecondWay被模拟并且findValue被单独存在,我该如何测试呢?

我认为我应该重构这个类,以便findValueFirstWayfindValueSecondWay在一个单独的类或类中?对于这么简单的事情,这似乎是不必要的工作。

3 个答案:

答案 0 :(得分:2)

你可以完全避免嘲笑,并通过真实物体的可见效果来测试它。

或者你可以模拟作为值传入的对象,并期望findValueFirstWay(Object obj)obj进行的任何调用都会导致它返回null等等。

然而,即使看起来很简单,我的第一个冲动仍然是将问题方法提取到一个或两个单独的类,以便可以使用模拟更自然地测试交互。

答案 1 :(得分:1)

我同意。您可以使用策略模式并为每种方式定义策略类,但在这种简单的情况下似乎有点过分。我没有看到使用部分模拟来测试它的错误。

答案 2 :(得分:0)

为什么不简单地为您的测试创建子类ValueFinder并覆盖两个受保护的方法?通过这种方式,您可以跟踪已调用的顺序(使用标志,变量,...),而无需将方法移动到其他位置。虽然这会是某种“部分嘲弄”,不是吗?