如何通过 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})