java - 如何通过 PowerMockito 模拟多个静态类

标签 java unit-testing powermockito

据我们所知,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/

相关文章:

java - 如何让我的程序等到 JavaFX 窗口关闭后再继续?

java - 在 groovy/java 中获取当前时间

javascript - 在服务单元测试中订阅模拟变量

c# - MSTest 断言因空引用而失败

java - 我如何使用 powermock stub Instant 对象

java - 无法完全模拟 RestHighLevelClient

java - 如何在 power mockito 中模拟生成的对象及其属性

java - AWS API 网关 + AWS ECS + OAuth2 密码授予

java - 为java程序制作本地远程的最简单方法是什么?

python - python中的每个单元测试之前都不会调用setUp函数