我看到Mockito 2不再使用CGLIB/proxy,而是使用ByteBuddy来创建模拟对象。这是不是意味着现在可以模拟静态方法和私有方法了?
不,你不能(在这里查看他们的文档here; 我确定他们会提到这个)。
因此,PowerMock(ito)和JMockit是支持模拟静态方法的两个模拟框架。
但是,个人意见是:尽管可以编写代码使用PowerMock进行测试,但还是应该优先选择使用Mockito;并且不需要PowerMock。我的意思是:当您编写自己的代码并认为您需要模拟静态调用时,那么您正在编写难以测试的代码。
答案不是寻找强大的模拟框架,而是编写易于测试的代码。 您可以观看这些视频以了解如何做到这一点。
最后:不要认为PowerMockito是一个好的替代品。Mockito现在已经是2.79版本(截至2017年3月)。但是,当你看一下PowerMockito时,你会发现它带有一些Mockito 2.0.42 beta的东西——因为PowerMockito的人无法让他们的工具与任何更新版本的Mockito配合使用。这是一件遗憾的事情,因为这些新的Mockito版本有很多有趣的功能。final
mocking 作为一个可选功能。它使用了一个Java agent(实际上是java.lang.instrument
API),这与JMockit相同的基本机制,另一个支持mocking statics等功能的 mocking 库,你也知道但“忘记”提到了。PowerMock从来不是唯一的,因为JMockit从2006年开始就一直在做这件事。最后,Mockito添加static
mocking只是时间问题。 - Rogério我编写了Mockito 2的一个扩展,它使用AspectJ
来允许模拟
甚至像静态/私有/最终方法
这样的东西,只需一个简单的基于lambda的语法,例如:
when(() -> YourClass.staticMethodToCall(...)).thenReturn(...)
static
方法的模拟支持,但是他们很可能会在未来版本中加入。毕竟,这可以基本上以与已经完成的final
模拟相同的方式完成。 - Rogério