所以首先,我会质疑你为什么是这样初始化的单例。看起来好像为你的.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几个假设 - 即你的单身正确检查,看是否该实例为null,如果是的话,初始化它。在这种情况下,我假设你的实例的变量名是“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");
}
}
同样,我会强烈建议您重新思考实现这样一个单身。单身应该很少使用 - 在可疑的设计模式之上的这种实现是眉毛提升者。 This question会使用一些很好的使用指南 - 确保你的单身人士符合这个标准。