【问题标题】:How to mock static call of a private static method in initialization of the class with (Power)Mockito?如何使用(Power)Mockito 在类的初始化中模拟私有静态方法的静态调用?
【发布时间】:2017-08-03 23:12:53
【问题描述】:

我有一个奇怪的情况,这是一些糟糕的设计造成的,但这是我需要接受的事实。问题是它在模拟时给我带来了麻烦,因为有问题的方法在尝试查找构建机器上不存在的一些本地文件时会产生副作用。

是这样的:

class BadDesignedClass {
    public static final Properies = loadProperties();
    private static Properties loadProperties() {
        // ... loads non-existent property file and crashes...
    }
}

我在模拟这个时遇到了问题,因为目前我提到了测试类中的类,它在 Mockito 或 PowerMockito 进行任何模拟之前调用了真正的 loadProperties(),这会导致抛出错误。

【问题讨论】:

    标签: java mocking powermockito


    【解决方案1】:

    加载类而不初始化它(详细信息可以在this answer 中找到)。然后不会调用loadProperties。这可以实现。

    Class<?> clazz = Thread.currentThread().getContextClassLoader()
        .loadClass("org.example.BadDesignedClass");
    

    然后您可以将clazz 传递给PowerMockito。

    【讨论】:

      【解决方案2】:

      为了获得完整的解决方案,我将在这里展示我在 SpaceTrucker 建议的启发下所做的确切工作:

      首先:加载类而不进行初始化:

      Class<?> clazz = Thread.currentThread().getContextClassLoader()
              .loadClass("org.example.BadDesignedClass");
      

      第二次:抑制导致所有问题的静态方法。

      PowerMockito.suppress(PowerMockito.method(clazz , "loadProperties"));
      

      第三次:继续像往常一样模拟课程,因为loadProperties() 现在已被禁止。

      PowerMockito.mockStatic(BadDesignedClass.class);
      PowerMockito.when(BadDesignedClass.someMethod()).thenReturn("something");
      

      【讨论】:

        猜你喜欢
        • 2017-03-14
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 2012-07-22
        • 2016-07-27
        • 1970-01-01
        • 1970-01-01
        • 2014-08-30
        相关资源
        最近更新 更多