【问题标题】:Power Mock unit tests for Static methods of local scope本地范围的静态方法的 Power Mock 单元测试
【发布时间】:2016-11-24 03:12:48
【问题描述】:

有没有一种使用power mockito来模拟下面代码中显示的静态方法的好方法?

@Singleton
public class AnimalWorks {

    public void verifyAnimal(Protocol proto, Set<Animal> successAnimals, Set<AnimalRule> rules, String zookeeper,OtherParams additionalParams) throws AnimalException, DAOException {
        ...

        // Static method call to fromAnimalId(arg1,arg2) below:
        // How to mock this method call with PowerMockito so I can have a custom aniSet?

        Set<Animal> aniSet = AnimalGenerator.fromAnimalId(dbtool, additionalParams); 

        ...

    }

} 

【问题讨论】:

    标签: java unit-testing static-methods powermock powermockito


    【解决方案1】:

    here 为例,解释了使用 PowerMock 模拟静态方法。

    但请记住:在谈论您的自己的生产代码时,这只是次优解决方案!因为:static 调用实际上是一个设计 问题。

    是的,静态方法很方便,但它们也会导致代码的直接/紧密耦合。当然,他们用 EasyMock 或 Mockito 打破了普通的单元测试......

    因此,替代答案是:不要使用 PowerMock。而是退后一步,从您的代码中删除该 static 依赖项。例如,通过创建一个表示所需功能的接口;然后,您无需在代码中进行静态调用,而是使用依赖注入来获取一些实现该接口的对象。

    突然之间,您不再需要 PowerMock。

    最后一句警告:许多人使用 PowerMock 时没有太多问题。但是当你做一些研究时,你也会发现很多人对 PowerMock 有各种奇怪的问题。所以,不要只选择那个工具,因为它看起来更方便。了解改进您的设计完全扼杀使用该工具的需要!

    编辑:

    重点是:你应该永远不要做某事,因为有人说“就这样吧”。理想情况下,您了解不同方法的优缺点,然后决定转向哪条路;取决于那个分析。当然,static 从一开始就在 Java 中可用;因此有很多人展示了很好的用例。

    但这并没有改变我提到的缺点(直接、紧密耦合)。事情是:我完全停止使用 statics - 以阻止单元测试的方式。我从不后悔。

    您会发现,有些人声称 static 会阻止您创建 可测试 代码 - 例如 here(观看这些视频值得每一分钟!)。这个主意不是我想出来的。

    【讨论】:

    • 问题在于它被建模为一个静态工厂方法,如有效的 java.lang. books.google.com/…
    • 同意。为这个不可实例化的类选择静态方法是一个设计时的决定,现在很难改变。回到这个问题 - 我查看了 dzone 文章,虽然它涉及解决这个难题的很多部分,但我仍然很难让它适用于我上面的示例,如果测试代码真的很有帮助为上述问题提供sn-p。
    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2019-05-11
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多