gpt4 book ai didi

java - 测试静态方法类必须更改为单例以进行 JUnit 测试

转载 作者:行者123 更新时间:2023-11-29 22:04:06 26 4
gpt4 key购买 nike

我有一个静态方法类 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 个线程来发送消息,我想看看静态方法调用与单例静态方法调用是否有影响。

除此之外还有其他测试方法吗?似乎一些 Java 反射会得到你需要的东西。

最佳答案

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

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

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

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

关于java - 测试静态方法类必须更改为单例以进行 JUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11229829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com