PowerMock: макетирование статических методов (+ возвращать исходные значения в некоторых конкретных методах) - PullRequest
13 голосов
/ 01 февраля 2011

Я использую PowerMock 1.4.7 и JUnit 4.8.2

Мне нужно смоделировать только некоторые статические методы, и я хочу, чтобы другие (из того же класса) просто возвращали исходное значение.Когда я высмеиваю mockStatic и не вызываю when().doReturn(), все статические методы возвращают свои значения по умолчанию - например, null при возврате Object или false при возврате логического значения ... и т. Д.Поэтому я стараюсь использовать thenCallRealMethod явно для каждого статического метода, чтобы вернуть реализацию по умолчанию (означает, что нет насмешек / подделок), но я не знаю, как вызывать его при всех возможных вариациях аргументов (= я хочу, чтобы каждый возможный исходный вызов исходный)метод).Я знаю только, как высмеивать конкретную вариацию аргумента.

Ответы [ 3 ]

30 голосов
/ 21 февраля 2011

Вы можете использовать шпиона в своем статическом классе и использовать только определенные методы:

@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"));
}

}
14 голосов
/ 10 января 2012

Вы также можете использовать API-интерфейс создания заглушек:

stub(method(MyStaticClass.class, "getB")).toReturn("B");

Редактировать:

Чтобы использовать stub и method методы статического импорта из этих пакетов:

  1. org.powermock.api.support.membermodification.MemberModifier
  2. org.powermock.api.support.membermodification.MemberMatcher

Для получения дополнительной информации см. Документацию

0 голосов
/ 20 мая 2019

На основании этого вопроса PowerMockito макет одного статического метода и возвращаемый объект

PowerMockito.mockStatic(MyStaticClass.class);

сам по себе не может издеваться над всеми методами (по крайней мере, в последних версиях PowerMockito), а только потом позволяет имитировать отдельные методы.

...