Я пытаюсь выполнить модульное тестирование некоторых классов, использующих класс Singleton, конструктор которого выполняет некоторые действия, которые я не могу (и не должен) делать из среды модульного тестирования. Мой идеальный сценарий заключался бы в том, чтобы полностью подавить конструктор, а затем отключить другие методы-члены, которые вызывают мои тестовые классы. Моя проблема в том, что я не могу подавить конструктор.
Насколько я понимаю, способ решения этой проблемы будет примерно таким:
public class MySingleton extends AbstractSingletonParent {
public final static MySingleton Only = new MySingleton();
private MySingleton(){
super(someVar); // I want the super-class constructor to not be called
//
//more code I want to avoid
}
public Object stubbedMethod() {}
}
public class ClassToBeTested {
public void SomeMethod(){
Object o = MySingleton.Only.stubbedMethod();
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(MySingleton.class)
public class TestClass {
@Test
public void SomeTest() {
suppress(constructor(MySingleton.class));
mockStatic(MySingleton.class);
PowerMock.replay(MySingleton.class);
// invoke ClassToBeTested, etc
PowerMock.verify(MySingleton.class);
//make some assertions
}
}
К сожалению, во время вызова createMock происходит срабатывание конструктора MySingleton, но он по-прежнему вызывает суперконструктор.
Я делаю что-нибудь глупое? Я нашел в Интернете пример, делающий почти именно это, но с использованием устаревшего метода suppressConstructor. Несмотря на устаревание, я пробовал и это, но безрезультатно ...
Возможно ли то, что я пытаюсь сделать? Если да, то что я делаю не так?
* Отредактированная версия теперь работает.