我对模拟框架非常陌生,我的工作需要模拟框架来完成单元测试。在当前的代码库中,我可以看到上面3个框架正在不同的地方用于单元测试。那么,我应该在上述3个框架中选择哪一个?
答案 0 :(得分:27)
我给你一个其他人可能不喜欢的解释,但我(以及我提到的很多人)发现/发现非常有帮助:PowerMock是一个嘲弄框架......你最好不要使用。
PowerMock的主要优势是您可以使用它来测试EasyMock无法模拟的某些构造(例如静态方法调用)。因此:当你想测试你无法改变的第三方代码时;并且包含静态调用;然后你可以转向PowerMock。
但是当你编写自己的代码时,你专注于writing testable code;然后你会发现“需要使用PowerMock”绝对等于“你在设计代码时做得不好”。例如,使用 static 直接导致类之间的直接耦合;因此,一旦它进入,它就会很难。
不要误解我的意思 - PowerMock在测试中占有一席之地;但其强大的功能需要付出一定的代价。
关于EasyMock / Mockito:主要是“两种不同的方式”写下测试用例;后一个导致测试,许多人发现更容易阅读;而EasyMock和“严格”模拟允许写下测试用例,这些测试用例会在生产代码中的大多数更改时快速破坏(这本身可能非常有用,或者非常烦人)。
答案 1 :(得分:4)
Here你可以找到Mockito和EasyMock之间的比较:
差异
没有录制/重播模式 - 不需要它们。你可以用Mockito模拟器做两件事 - 验证或存根。然后在执行和验证之前进行存根。
所有模拟都很好(甚至更好,因为集合返回方法返回空集合而不是空值)。即使模拟很好,您也可以根据需要严格验证它们并检测任何不需要的交互。
显式语言以提高可读性:verify()和when()VS期望(mock.foo())和mock.foo()的混合(没有预期的普通方法调用)。我相信你们中的一些人会发现这个论点是主观的:)
简化的存根模型 - 无论调用多少次,存根方法都会使用存根值重播。与EasyMock&StubReturn()和StubThrow()完全相同。此外,您可以使用不同参数的不同返回值存根(例如在EasyMock中)。
存根方法的验证是可选的,因为通常测试存根值是否正确使用而不是来自何处更为重要。
验证是明确的 - 验证错误指向代码行,显示哪些交互失败。
验证顺序灵活,无需验证每次互动。
自定义参数匹配器使用hamcrest匹配器,因此您可以使用现有的hamcrest匹配器。 (EasyMock也可以与Hamcrest集成,虽然它不是EasyMock的一部分而是Hamcrest。请参阅Hamcrest的文档。
PowerMock是其他Mocking框架的扩展,如Mockito或EasyMock,具有更强大的功能。这意味着您可以将Mockito / EasyMock和PowerMock结合到相同的单元测试中。
我个人使用Mockito对我的大部分代码和PowerMock进行单元测试,只需要代码中需要测试静态方法的额外功能。
答案 2 :(得分:1)
如果你控制你的设计,你应该对Mockito感到满意。 例如,PowerMock允许您模拟看起来很酷的私有成员,但如果您将该私有成员重构为通过依赖注入提供的参数,则不需要。