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

Mic*_*ard 13 java mocking mockito powermock

我使用的是PowerMock 1.4.7和JUnit 4.8.2

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

den*_*nko 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"));
}

}
Run Code Online (Sandbox Code Playgroud)

  • 什么是"给定"? (6认同)
  • 虽然这有效,但在使用matcher参数时要小心.如果您使用_Mockito.any()_并且您正在尝试存根spy的方法,则在评估存根语句期间会调用实际的getB()impl.如果getB()无法处理null参数,则会抛出NPE. (4认同)

Joh*_*han 15

您还可以使用存根API:

stub(method(MyStaticClass.class, "getB")).toReturn("B");
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

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

  • 这种方法对我有用,但来自 denis.solonenko 的答案没有。很难理解什么时候使用 doReturn、when、given 和 stub,它们都声称做同样的事情。每个有时都有效而不是其他 (2认同)