Powermock 测试失败

tis*_*sek 1 junit mockito powermock

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

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

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

在正常状态下,这些测试是 100% 一致且无不稳定的。

这样的更改怎么会无法通过完全有效的测试呢?

Gho*_*ica 6

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

但老实说;你走错地方了!

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

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

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

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

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

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

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