如何通过PowerMockito模拟几个静态类

时间:2017-01-07 04:45:35

标签: java unit-testing powermockito

正如我们所知,PowerMockito可以准备只测试一个最终,静态或私有类,如下所示:

@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或其他测试工具具有可以同时模拟多个静态类的功能,那就更好了。

1 个答案:

答案 0 :(得分:1)

  

编辑:例如,该方法将使用单个,工厂或一些不同类的静态方法。

您不应该首先使用静态访问类成员和方法,您还应该避免使用 Java singelton模式,还有其他可能性来确保您只有一个类的实例在运行时。

写完背后可以回答你的问题:

  

@PrepareForTest只有一个参数。

这个单个参数可能是一个数组:

@PrepareForTest({Class1.class,Class2.class})