PowerMock: издевательство статических методов (+ возвращать исходные значения в некоторых конкретных методах)
Я использую PowerMock 1.4.7 и JUnit 4.8.2
Мне нужно высмеять только некоторые статические методы, и я хочу других (из
тот же класс), чтобы вернуть исходное значение.
Когда я высмеиваю mockStatic
и не вызываю when().doReturn()
все
статические методы возвращают свои значения по умолчанию - как null при возврате объекта
или false при возврате boolean... и т.д. Поэтому я стараюсь использовать
thenCallRealMethod
явно для каждого статического метода для возврата
по умолчанию (означает, что насмехаются/нет подделок), но я не знаю
как вызвать его на всех возможных вариациях аргументов (= я хочу для всех возможных исходных методов ввода вызова). Я знаю только, как издеваться над конкретными вариациями аргументов.
Ответы
Ответ 1
Вы можете использовать шпион в своем статическом классе и высмеивать только определенные методы:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyStaticTest.MyStaticClass.class)
public class MyStaticTest {
public static class MyStaticClass {
public static String getA(String a) {
return a;
}
public static String getB(String b) {
return b;
}
}
@Test
public void should_partial_mock_static_class() throws Exception {
//given
PowerMockito.spy(MyStaticClass.class);
given(MyStaticClass.getB(Mockito.anyString())).willReturn("B");
//then
assertEquals("A", MyStaticClass.getA("A"));
assertEquals("B", MyStaticClass.getA("B"));
assertEquals("C", MyStaticClass.getA("C"));
assertEquals("B", MyStaticClass.getB("A"));
assertEquals("B", MyStaticClass.getB("B"));
assertEquals("B", MyStaticClass.getB("C"));
}
}
Ответ 2
Вы также можете использовать API-интерфейс заглушки:
stub(method(MyStaticClass.class, "getB")).toReturn("B");
Редактировать:
Чтобы использовать методы- stub
и method
статического импорта из этих пакетов:
-
org.powermock.api.support.membermodification.MemberModifier
-
org.powermock.api.support.membermodification.MemberMatcher
Для получения дополнительной информации обратитесь к документации
Ответ 3
На основании этого вопроса PowerMockito имитирует одиночный статический метод и возвращает объект
PowerMockito.mockStatic(MyStaticClass.class);
само по себе не может издеваться над всеми методами (по крайней мере, в последних версиях PowerMockito), а только позволяет потом высмеивать отдельные методы.
Ответ 4
Мне удалось использовать spy
и doReturn
, чтобы достичь этого.
class MyStatic {
static String foo() { return "foo"; }
static String bar() { return foo() + "bar"; }
}
@Test
public void shouldSpyStaticMethods() {
// arrange
spy(MyStatic.class);
doReturn("mocked foo").when(MyStatic.class);
MyStatic.foo();
// act
final String result = MyStatic.foobar();
// assert
assertThat(result).isEqualTo("mocked foobar");
}
doReturn
, сопровождаемый вызовом метода, который нужно смоделировать, выглядит странно (по крайней мере, для меня), но, похоже, делает свое дело.
Использование spy
с when(MyStatic.foo()).thenReturn("mocked foo")
не работает для меня.
Документация PowerMockito по насмешливому статическому методу.