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

我使用的是PowerMock 1.4.7和JUnit 4.8.2

我只需要模拟一些静态方法,我希望其他人(来自同一个类)只返回原始值。 当我使用mockStatic进行模拟并且不调用when().doReturn()所有静态方法都返回其默认值 – 返回Object时为null,返回boolean时返回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

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