所以首先,我会质疑为什么你有一个以这种方式初始化的单例。似乎向您的.getInstance(String s)
方法添加一个参数会增加歧义和意外行为,因为此 String 参数在实例化后将被忽略(除非您在类型更改时重新实例化它,在这种情况下它将是高度不可预测的运行)。
在任何情况下,一个简单的方法是将 test_mymethod() 抽象为一个父类,并有两个子测试类,每个子类实例化一个不同的单例实例。由于您的 JVM 不会重新启动,因此在运行任何测试之前,您还需要类似 PowerMock 的东西将单例重置为预加载状态。
所以父类看起来像这样(添加了 JUnit 注释):
public abstract class MyAbstractTestClass {
private final Dep_class dep_obj;
@Before
public abstract void setup(){
// Begin by ensuring that the singleton instance is initialized to null -
// this is highly important, since subclasses will not be able to rely on
// an un-initialized state
Whitebox.setInternalState(dep_obj.getInstance(/*default, arbitrary, or null value*/, "instance", null);
// Now leave the actual singleton initialization to child classes
dep_obj = getSingleton();
}
public abstract Dep_class getSingleton();
@Test
public void test_mymethod(){
//do something with dep_obj
}
}
我对 Powermock 做了一些假设——即你的单例正确地检查了实例是否为空,如果是,则初始化它。在这种情况下,我假设您的实例的变量名称是“instance”。接下来,您的子类将如下所示:
public class MyTestClass1 extends MyAbstractTestClass {
@Override
public void Dep_class getSingleton() {
return Dep_class.getInstance("VALUE_1");
}
}
public class MyTestClass2 extends MyAbstractTestClass {
@Override
public void Dep_class getSingleton() {
return Dep_class.getInstance("VALUE_2");
}
}
同样,我强烈建议您重新考虑以这种方式实现单例。无论如何,应该很少使用单例 - 在有问题的设计模式之上的这样的实现是令人侧目的。 这个问题涵盖了一些很好的使用指南——确保你的单例符合这个标准。