Итак, прежде всего, я хотел бы спросить, почему у вас есть синглтон, который инициализируется таким образом. Кажется, что добавление аргумента в ваш метод .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 - а именно, что ваш одноточечно правильно проверяет, если экземпляр является недействительным и если это так, инициализирует его. В этом случае я предполагаю, что имя переменной для вашего экземпляра является «экземпляром». Далее, ваш ребенок классы будут выглядеть следующим образом:
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 содержит некоторые полезные рекомендации по использованию - убедитесь, что ваш синглтон соответствует этим критериям.