1

我有一个静态方法类 Utils,它基本上用于实用方法,几乎​​每个类都使用它。它做一些事情,比如获取文件和其他基本的东西。我的测试人员将这个类更改为单例,这样每个使用 Utils 的类现在都必须调用 getInstance()。原因是除非是这种情况,否则他无法测试某些东西。在我看来,这在某些方面是错误的,这可能会导致问题。

public class Utils {

/**
 * Singleton method to allow for easier testing.
 * @return an instance of
 */
public synchronized static Utils getInstance() {
    if (instance == null) {
        instance = new Utils();
    }
    return instance;
}

public synchronized static void setInstance(Utils instance) {
    Utils.instance = instance;
}

/** Singleton to make testing easier **/
private static Utils instance = null;

public static boolean checkOSTen() {
    return getInstance()._checkOSTen();
}

private boolean _checkOSTen() {
    boolean autoPair = false;
    if (android.os.Build.VERSION.SDK_INT >= 10){   
        autoPair = true;
    }
    return autoPair;
}

}

顺便说一句,我有一个非常复杂的内部消息传递系统,它使用至少 7 个线程来发送消息,并且想看看静态方法调用与 Singleton 静态方法调用是否有影响。

除了这个,还有其他方法可以进行测试吗?似乎一些Java反射会得到你需要的东西。

4

1 回答 1

2

您的测试人员可能会发现此代码难以测试,因为他们无法轻松更改 的返回值android.os.Build.VERSION.SDK_INT,因此他们无法轻松测试根据此返回值使用的不同代码路径。通过使用实例方法,他们可以使用模拟框架来伪造该_checkOSTen方法以返回trueor false,具体取决于他们尝试测试的内容。

进行测试的另一种方法是根本不使用诸如此类的静态方法,而是使用类(可能称为DeviceCapabilities),它将通过 setter 或构造函数注入到需要了解操作系统版本的所有其他类中。

然后,您的测试人员可以轻松地将实例传递DeviceCapabilities给需要访问此信息的任何类。

也就是说,在您构建的这个阶段,进行这样的更改可能为时已晚,因此您的测试人员所做的更改是一个合理的妥协。

于 2012-06-28T15:25:59.463 回答