[英]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");
编辑:
要使用stub
和method
从这些包静态导入方法:
org.powermock.api.support.membermodification.MemberModifier
org.powermock.api.support.membermodification.MemberMatcher
有关更多信息,请参阅文档
我设法使用spy
和doReturn
来实现它。
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
的方法看起来很奇怪(至少对我而言),但似乎可以解决问题。
将spy
与when(MyStatic.foo()).thenReturn("mocked foo")
使用对我不起作用。
PowerMockito 关于模拟静态方法的文档。
基于这个问题PowerMockito 模拟单个静态方法和返回对象
PowerMockito.mockStatic(MyStaticClass.class);
单独不会模拟所有方法(至少在 PowerMockito 的最新版本中),只能在以后模拟单个方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.