Подтвердить что ты не робот

PowerMock: издевательство статических методов (+ возвращать исходные значения в некоторых конкретных методах)

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

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

4b9b3361

Ответ 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 статического импорта из этих пакетов:

  1. org.powermock.api.support.membermodification.MemberModifier
  2. 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 по насмешливому статическому методу.