据我们所知,PowerMockito 只能为测试准备一个最终的、静态的或私有(private)类,如下所示:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassNumber1.class)
public class SomeClassUnderTest{
@Before
public void setUp() throws Exception {
}
@Test
public void testSomeMethod() throws Exception {
}
}
但是我要测试的方法使用多个静态类。我想做的事情看起来像:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassNumber1.class, SomeClassNumber2.class)
public class SomeClassUnderTest{
但是 @PrepareForTest 只有一个参数。
编辑:例如,该方法将使用单例、工厂或不同类的一些静态方法。
public class SomeClass {
private Session session;
private Object object;
public void someMethod(int userId) {
Session session = Session.getSession(userId);
Object object = Singleton.getInstance();
}
}
注意:该问题可以通过使用单一责任原则来解决。例如我可以将其提取到另一个方法(如下所示),然后模拟它,而不是在要测试的方法中使用单例:
public class SomeClass {
private Session session;
private Object object;
public void someMethod(int userId) {
session = getSession(userId);
object = getInstance();
}
private getSession(userId) {
return Session.getSession(userId);
}
private Object getInstance(){
return Singleton.getInstance();
}
}
但这对我来说似乎也不是一个好的解决方案。如果PowerMockito或者其他测试工具能够同时模拟多个静态类就更好了。
最佳答案
Edit: For instance the method will use singleton, factory or some static methods of different classes.
您不应该首先使用对类成员和方法的静态访问,您还应该避免Java singleton 模式,还有其他可能性来确保您只有一个类的实例在运行时。
<小时/>写完这篇文章后,让我们回答您的问题:
@PrepareForTest has only one argument.
这个单个参数可以是一个数组:
@PrepareForTest({Class1.class,Class2.class})
关于java - 如何通过 PowerMockito 模拟多个静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41517885/