Ответ 1
Что вы хотите сделать, это комбинация части 1 и всего 2.
Вам нужно использовать PowerMockito.mockStatic для включения статического смеха для всех статических методов класса. Это означает, что возможно, чтобы заглушить их, используя синтаксис when-thenReturn.
Но 2-аргументная перегрузка mockStatic, которую вы используете, использует стратегию по умолчанию для того, что Mockito/PowerMock должен делать, когда вы вызываете метод, который вы явно не наложили на экземпляр mock.
Из javadoc:
Создает макет класса с указанной стратегией для ответов на взаимодействия. Это довольно продвинутая функция и, как правило, вам не нужна это написать достойные тесты. Однако это может быть полезно при работе с устаревшие системы. Это ответ по умолчанию, поэтому он будет использоваться только тогда, когда вы не закрываете вызов метода.
Стратегия stubbing по умолчанию по умолчанию - это просто вернуть null, 0 или false для объектов, числа и логических значений. Используя перегрузку 2-arg, вы говорите: "Нет, нет, нет, по умолчанию используйте метод ответа" Подкласс "ответа, чтобы получить значение по умолчанию. Он возвращает Long, поэтому, если у вас есть статические методы, возвращающие что-то несовместимое с Долго, есть проблема.
Вместо этого используйте версию mockStatic 1-arg для включения stubbing статических методов, а затем используйте when-thenReturn, чтобы указать, что делать для определенного метода. Например:
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
class ClassWithStatics {
public static String getString() {
return "String";
}
public static int getInt() {
return 1;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
@Test
public void test() {
PowerMockito.mockStatic(ClassWithStatics.class);
when(ClassWithStatics.getString()).thenReturn("Hello!");
System.out.println("String: " + ClassWithStatics.getString());
System.out.println("Int: " + ClassWithStatics.getInt());
}
}
String -значный статический метод заглушается, чтобы возвращать "Hello!", в то время как встроенный статический метод использует стандартную процедуру stubbing, возвращая 0.