Вы должны/могли бы использовать шаблон Singleton.
В основном все статические методы вызывают внутренний частный объект, который выполняет фактическую логику (называемый экземпляром).
Если вы сделаете это, вы можете предоставить защищенный статический метод setInstance
. Во время теста вы создаете посмеянный экземпляр и установите его в статический класс.
Это выполнимо, но это не самое элегантное решение, но статические вызовы не настолько элегантны в первую очередь. Я отвечаю, как не было никакой возможности, чтобы реорганизовать из всего кодовых (например, с помощью Dependency Injection, например)
Например:
class GlobalData {
//private object that does all the actual logic
private static GlobalData instance = new GlobalData();
//constructor is private so no one can call it
private GlobalData() {
}
//delegate the static call to the internal instance
static boolean doSomething(...){ return instance._doSomething(); }
//use underscore to keep similar name but avoid ambiguous call
private boolean _doSomething(...){ ... }
//same here
static xxx A() { return instance._A(); }
private xxx _A() {...}
//this is not public, so must be called from the same package
//since the constructor is private, no one will be able to create a GlobalData
//except for mockito
static void setInstance(GlobalData instance) {
GlobalData.instance = instance;
}
}
, а затем в тесте (который должен быть в том же пакете):
GlobalData instanceMocked = mock(GlobalData.class);
//we mock the methods with underscore, as they are the instance methods, and
//not the class methods
when(instanceMocked._A()).thenReturn(whatever);
when(instanceMocked._doSomething()).thenReturn(whatever);
GlobalData.setInstance(instanceMocked);
Для этого требуется лишь незначительное рефакторинг в классе вы смотрите, не касаясь остальной части проекта, в то время как достижения того, что вы хотите.
не с одной только Mockito, но с Powermockito вы можете: http://www.codeproject.com/Articles/806508/Using-PowerMockito-to-Mock-Final-and-Static-Method –
ОП Ждут» Спросите о Powermockito. Итак ... Я поддерживаю свой ответ. –
Вы можете использовать PowerMockito. –