PowerMock、EasyMock 和 Mockito 框架有啥区别? [复制]

Posted

技术标签:

【中文标题】PowerMock、EasyMock 和 Mockito 框架有啥区别? [复制]【英文标题】:What is the difference between PowerMock, EasyMock and Mockito frameworks? [duplicate]PowerMock、EasyMock 和 Mockito 框架有什么区别? [复制] 【发布时间】:2017-01-11 15:48:53 【问题描述】:

我对 mocking 框架很陌生,我的工作需要 mocking 框架来完成单元测试。在当前的代码库中,我可以看到以上 3 个框架在不同的地方用于单元测试。那么,我应该在上述 3 个框架中选择哪一个?

【问题讨论】:

@Mureinik 谢谢。我将问题标记为重复,因为我能够在另一个问题中获得所需的信息。 使用 Java 反射来修改静态方法的行为 @Mureinik “其他问题”的价值是什么? 【参考方案1】:

我给你一个其他人可能不会喜欢的解释,但我(和我提到的很多人)发现/发现它非常有帮助:PowerMock 是一个模拟框架......你最好不要使用。

PowerMock 的主要优势 是您可以使用它来测试 EasyMock 无法模拟的某些构造(例如 静态 方法调用)。因此:当您想测试无法更改的第 3 方代码时;并且包含静态调用;那么你可能会转向 PowerMock。

但是当你编写自己的代码时,你专注于writing testable code;那么你会发现“需要使用PowerMock”绝对等于“你在设计代码方面做得不好”。例如,使用 static 会直接导致类之间的直接耦合;因此,一旦它进入,就很难摆脱它。

不要误会我的意思 - PowerMock 在测试中占有一席之地;但其强大的功能需要付出一定的代价。

关于 EasyMock / Mockito:主要是“两种不同的方式”写测试用例;后者导致许多人觉得更容易阅读的测试;而 EasyMock 和“严格”模拟允许编写测试用例,这些测试用例会在生产代码中的大多数更改时迅速中断(这本身可能非常有用,或者非常烦人)。

【讨论】:

这确实是一个非常好的建议。感谢您分享您的意见! 很好的建议。非常感谢! 是否正确地说 private static final 应该只用于: 1. 不应该公开的常量(例如,内存中嵌入式数据库的用户名或密码)或 2. a并发/并行/线程安全构造(例如,用于简单自定义缓存的 ConcurrentHashMap)? @cody.tv.weber 我永远不会在代码中输入密码。不属于那里,通常。好吧,它适用于私有常量。你在没有你的类的情况下使用的东西,但没有其他类需要。例如:一个常见的跟踪器/记录器对象。【参考方案2】:

Here你可以找到Mockito和EasyMock的对比:

区别

没有记录/回放模式 - 不需要它们。使用 Mockito 模拟只能做两件事 - 验证或存根。存根在执行之前进行,之后进行验证。

所有模拟都很好(甚至更好,因为返回集合的方法返回空集合而不是空值)。即使模拟很好,您也可以根据需要严格验证它们并检测任何不需要的交互。

为了更好的可读性的显式语言:verify() 和 when() 与 expect(mock.foo()) 和 mock.foo() 的混合(没有期望的普通方法调用)。我相信你们中的一些人会觉得这个论点很主观:)

简化的存根模型 - 存根方法始终以存根值重放,无论它们被调用多少次。与 EasyMock 的 andStubReturn() 和 andStubThrow() 完全一样。此外,您可以为不同的参数使用不同的返回值(例如在 EasyMock 中)。

验证存根方法是可选的,因为通常更重要的是测试存根值是否正确使用,而不是它的来源。

验证是明确的 - 验证错误指向显示交互失败的代码行。

按顺序验证很灵活,不需要验证每一次交互。

自定义参数匹配器使用 hamcrest 匹配器,因此您可以使用现有的 hamcrest 匹配器。 (EasyMock 也可以与 Hamcrest 集成,尽管它不是 EasyMock 的一部分,而是 Hamcrest。请参阅 Hamcrest 的文档。

PowerMock 是其他 Mocking 框架(如 Mockito 或 EasyMock)的扩展,具有更强大的功能。这意味着您可以将 Mockito/EasyMock 和 PowerMock 组合到同一个单元测试中。

我个人使用 Mockito 对我的大部分代码进行单元测试,而 PowerMock 仅用于需要其额外功能作为测试静态方法的代码。

【讨论】:

【参考方案3】:

如果您控制自己的设计,并且您应该可以使用 Mockito。 例如,PowerMock 允许您模拟一个看起来很酷的私有成员,但如果您将该私有成员重构为通过依赖注入提供的参数,则没有必要。

【讨论】:

以上是关于PowerMock、EasyMock 和 Mockito 框架有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PowerMock使用指南

如何在Java Unit Test中mock 静态方法

powermock, 强力模拟

PowerMock

如何用powermockrunner覆盖循环

PowerMock、EasyMock 和 Mockito 框架有啥区别? [复制]