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

2022-09-02 19:28:04

我使用PowerMock 1.4.7和JUnit 4.8.2

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


答案 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");

编辑:

要使用这些包中的方法并静态导入方法,请执行以下操作:stubmethod

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

有关详细信息,请参阅文档


推荐