Powermock测试失败

时间:2017-04-28 00:12:01

标签: junit mockito powermock

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

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

在大约25次测试中,5或6次失败显然有功能性原因(我的意思是他们在运行代码中的实际失败时失败了,而不是在一些基础设施错误上)。

在正常状态下,这些测试是100%一致且非片状的。

这样的改变怎么可能无法完全运行测试?

2 个答案:

答案 0 :(得分:3)

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

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

PowerMock(ito)提供的仅有两个功能超过Mockito:它可以模拟静态调用和调用new()。

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

  • Mockito的后级版本被强加给你。 Mockito本身现在的版本是2.8;但是PowerMockito不能使用比Mockito 2.0.40 beta更新的东西(Mockito团队几乎每周发布一次
  • )。
  • PowerMock依赖于字节码操作。含义:模拟静态调用会更改生成代码。是的,所有这些都有效。但是,只需查看标记为PowerMock的所有questions - 您可能会注意到一种模式。有一些关于模糊问题的问题,通常没有答案。一旦你开始使用其他JVM而不是Oracle ......" fun"保证。 (相信我,去过那里!)
  • PowerMock与其他需要字节码操作的框架并不相称,例如EcLemma用于覆盖率测量。

除此之外:你的需要使用PowerMock并不是一成不变的。它基于您创建难以测试代码的事实。

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

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

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

答案 1 :(得分:0)

尽管这是一篇老文章,但我最近也有类似的经历,并且遇到了PowerMock和Mockito之间的依赖关系矩阵。

当在Springboot项目中同时使用Mockito和PowerMock依赖项时,我们需要对所使用的PowerMock和Mockito的版本保持谨慎。

这里是dependency matrix

通常,Spring Boot启动程序测试带有Mockito版本。就我而言,我必须从启动器中排除Mockito依赖项,并添加与最新PowerMock版本一起使用的Mockito版本。如果这对任何人有帮助,都会很高兴。