【问题标题】:Powermock fails testsPowermock 测试失败
【发布时间】:2017-04-28 00:12:00
【问题描述】:

我想用 Powermockrunnner 替换我的 JUnitRunner(以便进一步使用 Powermock 的简单 Mockito 所没有的功能)。

所以我添加了依赖项,替换了我的测试类中的运行器,并添加了 @PrepareForTest 注释,然后在编写任何进一步的测试代码之前,运行我现有的测试来验证它们。

在大约 25 个测试中,有 5 或 6 个因明显的功能原因而失败(我的意思是,它们因运行代码中的实际故障而失败,而不是由于某些基础设施错误)。

在正常状态下,这些测试是 100% 一致且不易出错的。

这样的更改怎么会无法通过完整的工作测试?

【问题讨论】:

    标签: junit mockito powermock


    【解决方案1】:

    为了帮助您诊断问题,您必须发布一些失败的测试。

    但老实说;你在这里走错了兔子洞!

    PowerMock(ito) 在 Mockito 上提供的唯一两个功能是:它可以模拟静态调用和对 new() 的调用。

    您为这些功能支付的奖励:

    • Mockito 的低级版本是强加给你的。 Mockito 本身现在是 2.8 版;但是 PowerMockito 不能与比 Mockito 2.0.40 beta 更新的任何东西一起使用(而且 Mockito 团队几乎每周发布一次!)
    • PowerMock 依赖于字节码操作。含义:模拟静态调用会改变你的生产代码。是的,所有这些都有效。但只要看看这里标记为 PowerMock 的所有questions - 你可能会注意到一个模式。有很多关于晦涩难懂的问题的问题,大多数情况下都没有答案。并且一旦您开始使用 Oracle 以外的其他 JVM……“乐趣”就得到保证。 (相信我,去过那里!)
    • PowerMock 不能很好地与需要字节码操作的其他框架配合使用,例如用于覆盖测量的 EcLemma。

    除此之外:您需要使用 PowerMock 并不是突然出现的。它基于您创建难以测试代码的事实。

    因此我的建议是:学习如何编写易于测试的代码(例如通过观看这些videos)。那里的核心方面:易于测试的代码很可能也是更好设计的。 静态导致紧耦合,它打破了多态性,这是OO的本质。

    所以,我的建议是:升级到最新版本的 Mockito;而不是花时间去了解 A) 过去曾造成很多痛苦的框架 B) 鼓励您不要修复损坏的设计,而是解决它们。

    2 美分的个人经验:当我们开始单元测试时,我们的团队正在使用 PowerMock。我们花了无数个小时研究那些奇怪的 PowerMock 问题。最后:我们学会了如何编写更好的生产代码;我们学会了如何用 Mockito 正确地测试它们。我们不再使用 PowerMock;我们从未后悔过这个决定。

    【讨论】:

      【解决方案2】:

      虽然这是一篇老帖子,但我最近也有类似的经历,并且遇到了 PowerMock 和 Mockito 之间的依赖矩阵。

      当我们在 Springboot 项目中同时使用 Mockito 和 PowerMock 依赖项时,我们需要注意我们正在使用的 PowerMock 和 Mockito 的版本。

      这是相同的dependency matrix

      通常 Spring boot 启动器测试附带一个 Mockito 版本。在我的情况下,我必须从启动器中排除 Mockito 依赖项,并添加与最新 PowerMock 版本配合良好的 Mockito 版本。如果这对任何人都有帮助,我会很高兴。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        相关资源
        最近更新 更多