PowerMock:模拟静态方法(+在某些特定方法中返回原始值)

时间:2011-02-01 08:42:54

标签: java mocking mockito powermock

我使用的是PowerMock 1.4.7和JUnit 4.8.2

我只需要模拟一些静态方法,而我需要其他方法(来自 同一类)只是为了返回原始值。 当我使用mockStatic进行模拟时,不要全部调用when().doReturn() static方法返回默认值 - 返回Object时返回null 返回布尔值时返回false或者等等。所以我试着用 thenCallRealMethod显式地返回每个静态方法 默认实现(意味着没有嘲笑/没有假货),但我不知道 如何在每个可能的参数变量上调用它(=我希望每个可能的输入调用原始方法)。我只知道如何模拟具体的论证变异。

4 个答案:

答案 0 :(得分:30)

您可以在静态类上使用间谍,并仅模拟特定方法:

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

}

答案 1 :(得分:14)

您还可以使用存根API:

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

编辑:

要从这些软件包中使用stubmethod静态导入方法:

  1. org.powermock.api.support.membermodification.MemberModifier
  2. org.powermock.api.support.membermodification.MemberMatcher
  3. 有关详细信息,请参阅documentation

答案 2 :(得分:0)

基于这个问题PowerMockito mock single static method and return object

PowerMockito.mockStatic(MyStaticClass.class);

单独不能模拟所有方法(至少在PowerMockito的最新版本中),而只能在以后对单个方法进行模拟。

答案 3 :(得分:0)

我设法使用spydoReturn来实现它。

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后再调用要模拟的方法看起来很奇怪(至少在我看来),但似乎可以解决问题。

spywhen(MyStatic.foo()).thenReturn("mocked foo")一起使用对我不起作用。

PowerMockito在mocking static method上的文档。