我正在使用 PowerMock 来模拟 junit 测试中的静态方法,通常如下所示:
@RunWith(PowerMockRunner.class)
@PrepareForTest({Foo.class,Bar.class})
public class SomeUnitTest {
@Before
public void setUpTest() {
setUpFoo();
setUpBar();
}
private void setUpFoo() {
mockStatic(Foo.class);
when(Foo.someStaticMethod()).thenReturn(1);
}
private void setUpBar() {
mockStatic(Bar.class);
when(Bar.someStaticMethod()).thenReturn(2);
}
@Test
public void someTestCase() {
...
}
}
这很好用,但我发现指定@PrepareForTest
注释会阻止我使我的测试 API 变得灵活。
我想做的是如下所示:
public class MockLibraryOne {
public static void setUpLibraryOne() {
setUpFoo();
setUpBar();
}
private static void setUpFoo() {
mockStatic(Foo.class);
when(Foo.someStaticMethod()).thenReturn(1);
}
private static void setUpBar() {
mockStatic(Bar.class);
when(Bar.someStaticMethod()).thenReturn(2);
}
}
@RunWith(PowerMockRunner.class)
public class SomeUnitTest {
@Before
public void setUpTest() {
MockLibraryOne.setUpLibraryOne();
}
@Test
public void someTestCase() {
...
}
}
这里我的单元测试对 有依赖LibraryOne
,但是它不知道LibraryOne
依赖哪些类,所以不知道要添加哪些类到@PrepareForTest
注解中。
我可以SomeUnitTest
扩展MockLibraryOne
并将@PrepareForTest
注释添加到MockLibraryOne
类中,但我将依赖MockLibraryOne
于其他单元测试之外的更多内容,因此继承不是通用解决方案。
是否有某种方式以编程方式准备类以在 PowerMock 下进行测试,而不是使用@PrepareForTest
注释?例如,如下所示:
public class MockLibraryOne {
public static void setUpLibraryOne() {
setUpFoo();
setUpBar();
}
private static void setUpFoo() {
prepareForTest(Foo.class);
mockStatic(Foo.class);
when(Foo.someStaticMethod()).thenReturn(1);
}
private static void setUpBar() {
prepareForTest(Bar.class);
mockStatic(Bar.class);
when(Bar.someStaticMethod()).thenReturn(2);
}
}
我想如果以不同PowerMockRunner
的方式处理@PrepareForTest
注释会很好:对于每个指定的类,它不仅应该将该类(及其层次结构)添加到类列表中以准备模拟,然后检查该类以查看它是否也有任何@PrepareForTest
注释:
@RunWith(PowerMockRunner.class)
@PrepareForTest({MockLibraryOne.class})
public class SomeUnitTest {
...
}
@PrepareForTest({Foo.class,Bar.class})
public class MockLibraryOne {
...
}
}
所以在这个@PrepareForTest
注释上SomeUnitTest
会找到MockLibraryOne
,并且那里的注释@PrepareForTest
也会拖进来。Foo.class
Bar.class
所以也许编写我自己的测试运行器来替换PowerMockRunner
可能是一个解决方案。
或者也许有一个更简单的解决方案,PowerMockAgent
例如使用类?
编辑:模拟政策可能是一种解决方案:https ://code.google.com/p/powermock/wiki/MockPolicies
编辑:模拟策略适用PowerMockRunner
但(似乎)不适用(PowerMockRule
由于类加载器问题,我有时需要)。