繁体   English   中英

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

[英]PowerMock: mocking of static methods (+ return original values in some particular methods)

我使用 PowerMock 1.4.7 和 JUnit 4.8.2

我只需要模拟一些静态方法,而我希望其他方法(来自同一类)只返回原始值。 当我用mockStatic模拟并且不调用when().doReturn()所有静态方法都返回它们的默认值 - 例如返回 Object 时为 null 或返回布尔值时为 false 等。 所以我尝试在每个静态方法上显式使用thenCallRealMethod来返回默认实现(意味着没有模拟/没有假货)但我不知道如何在每个可能的参数变化上调用它(=我想要每个可能的输入调用原始方法) . 我只知道如何模拟具体的参数变化。

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

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

}

您还可以使用存根 API:

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

编辑:

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

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

有关更多信息,请参阅文档

我设法使用spydoReturn来实现它。

class MyStatic {
    static String foo() { return "foo"; }
    static String foobar() { return foo() + "bar"; }
}

@Test
public void thisShouldSpyStaticMethods() {
    // 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然后调用要doReturn的方法看起来很奇怪(至少对我而言),但似乎可以解决问题。

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

PowerMockito 关于模拟静态方法的文档。

基于这个问题PowerMockito 模拟单个静态方法和返回对象

PowerMockito.mockStatic(MyStaticClass.class);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM