我们知道,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或其他测试工具具有可以同时模拟多个静态类的功能,则更好。

最佳答案

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


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



写完这些可以回答您的问题:


@PrepareForTest只有一个参数。


这个单独的参数可以是一个数组:

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

关于java - 如何通过PowerMockito模拟几个静态类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41517885/

10-11 22:26
查看更多