如何通过 PowerMockito 模拟几个静态 类
How to mock several static classes by PowerMockito
据我们所知,PowerMockito 只能准备测试一个最终的、静态的或私有的 class,如下所示:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassNumber1.class)
public class SomeClassUnderTest{
@Before
public void setUp() throws Exception {
}
@Test
public void testSomeMethod() throws Exception {
}
}
但是我要测试的方法使用了多个静态 classes。我想做的事情看起来像:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassNumber1.class, SomeClassNumber2.class)
public class SomeClassUnderTest{
但是@PrepareForTest 只有一个参数。
编辑: 例如,该方法将使用单例、工厂或一些不同classes 的静态方法。
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或者其他测试工具有同时mock多个staticclasses的功能就更好了。
Edit: For instance the method will use singleton, factory or some static methods of different classes.
首先你不应该使用对class成员和方法的静态访问,你也应该避免Java单例模式,有确保您在运行时只有一个 class 实例的其他可能性。
写到这里让我们回答你的问题:
@PrepareForTest has only one argument.
这个参数可能是一个数组:
@PrepareForTest({Class1.class,Class2.class})
据我们所知,PowerMockito 只能准备测试一个最终的、静态的或私有的 class,如下所示:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassNumber1.class)
public class SomeClassUnderTest{
@Before
public void setUp() throws Exception {
}
@Test
public void testSomeMethod() throws Exception {
}
}
但是我要测试的方法使用了多个静态 classes。我想做的事情看起来像:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassNumber1.class, SomeClassNumber2.class)
public class SomeClassUnderTest{
但是@PrepareForTest 只有一个参数。
编辑: 例如,该方法将使用单例、工厂或一些不同classes 的静态方法。
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或者其他测试工具有同时mock多个staticclasses的功能就更好了。
Edit: For instance the method will use singleton, factory or some static methods of different classes.
首先你不应该使用对class成员和方法的静态访问,你也应该避免Java单例模式,有确保您在运行时只有一个 class 实例的其他可能性。
写到这里让我们回答你的问题:
@PrepareForTest has only one argument.
这个参数可能是一个数组:
@PrepareForTest({Class1.class,Class2.class})