我使用的是PowerMock 1.4.7和JUnit 4.8.2
我只需要模拟一些静态方法,而我需要其他方法(来自
同一类)只是为了返回原始值。
当我使用mockStatic
进行模拟时,不要全部调用when().doReturn()
static方法返回默认值 - 返回Object时返回null
返回布尔值时返回false或者等等。所以我试着用
thenCallRealMethod
显式地返回每个静态方法
默认实现(意味着没有嘲笑/没有假货),但我不知道
如何在每个可能的参数变量上调用它(=我希望每个可能的输入调用原始方法)。我只知道如何模拟具体的论证变异。
答案 0 :(得分: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"));
}
}
答案 1 :(得分:14)
您还可以使用存根API:
stub(method(MyStaticClass.class, "getB")).toReturn("B");
编辑:
要从这些软件包中使用stub
和method
静态导入方法:
org.powermock.api.support.membermodification.MemberModifier
org.powermock.api.support.membermodification.MemberMatcher
有关详细信息,请参阅documentation
答案 2 :(得分:0)
基于这个问题PowerMockito mock single static method and return object
PowerMockito.mockStatic(MyStaticClass.class);
单独不能模拟所有方法(至少在PowerMockito的最新版本中),而只能在以后对单个方法进行模拟。
答案 3 :(得分:0)
我设法使用spy
和doReturn
来实现它。
class MyStatic {
static String foo() { return "foo"; }
static String bar() { return foo() + "bar"; }
}
@Test
public void shouldSpyStaticMethods() {
// 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
后再调用要模拟的方法看起来很奇怪(至少在我看来),但似乎可以解决问题。
将spy
与when(MyStatic.foo()).thenReturn("mocked foo")
一起使用对我不起作用。
PowerMockito在mocking static method上的文档。