我对mock框架很陌生,我的工作需要mock框架来完成单元测试。在当前的代码库中,我可以看到以上3个框架正在不同的地方用于单元测试。那么,在以上3个框架中我应该选择哪一个呢?
我给你一个其他人可能不喜欢的解释,但是我(和很多我提到过它的人)发现/发现它非常有用:PowerMock是一个mock框架…你最好不要用。
PowerMock的主要优势是您可以使用它来测试某些EasyMock无法模拟的结构(例如static方法调用)。因此:当你想测试第三方代码,你不能改变;它包含静态调用;那么你可以使用PowerMock。但是当你编写自己的代码时,你专注于编写可测试的代码;那么你会发现"需要使用PowerMock"就等于"你的代码设计得很糟糕"。例如,使用static直接导致类之间的直接耦合;因此,很难在中删除它。
不要误解我的意思- PowerMock在测试中有它的位置;但它的强大功能是有一定代价的。
关于EasyMock/Mockito:主要是写测试用例的"两种不同方式";后者是许多人觉得更容易阅读的测试;而EasyMock和"严格"mock允许编写测试用例,这些用例将在您的生产代码中的大多数更改中快速中断(这本身可能非常有用,也可能非常令人讨厌)。
你可以在这里找到Mockito和EasyMock的比较:
的差异
没有记录/重放模式-不需要它们。对于Mockito模型,你只能做两件事——验证或存根。存根在执行前,验证在执行后。
所有的模拟都很好(甚至更好,因为集合返回方法返回空集合而不是null)。尽管模拟很好,但您可以根据需要严格地验证它们,并检测任何不需要的交互。
具有更好可读性的显式语言:verify()和when()与expect(mock.foo())和mock.foo()(不带expect的普通方法调用)的混合。我相信你们中的一些人会觉得这个论点很主观:)
简化的存根模型——存根方法无论被调用多少次都会用存根值重播。工作原理完全像EasyMock的andStubReturn()和stubthrow()。此外,您可以为不同的参数使用不同的返回值(如EasyMock)。
验证存根方法是可选的,因为通常测试存根值是否被正确使用比测试它来自哪里更重要。
验证是显式的-验证错误指向显示交互失败的代码行。
顺序验证是灵活的,不需要验证每一个交互
自定义参数匹配器使用hamcrest匹配器,所以你可以使用你现有的hamcrest匹配器。(EasyMock也可以与Hamcrest集成,尽管它不是EasyMock的一部分,而是Hamcrest。
PowerMock是其他mock框架(如Mockito或EasyMock)的扩展,具有更强大的功能。这意味着您可以将Mockito/EasyMock和PowerMock组合到同一个单元测试中。
我个人使用Mockito对我的大部分代码进行单元测试,而PowerMock只在需要测试静态方法等额外功能的代码中使用。
如果你能控制你的设计,你应该对Mockito很满意。例如,PowerMock允许您模拟一个私有成员,这看起来很酷,但如果您将该私有成员重构为通过依赖注入提供的参数,则没有必要。