2

我在基于 Spring 的项目中工作。我的客户要求为我的服务和 DAO 层编写 JUnit 测试用例。
我必须对要使用的 Mocking 框架做出决定,并且尽快将其传达给客户。
我以前从未使用过任何 Mocking 框架。我在网上搜索时听说过 Mockito、JMock、EasyMock 等。但是没有得到任何令人信服的答案,我应该使用哪个。
所以,我需要一些帮助来选择正确的模拟框架。

4

1 回答 1

2

正如其他评论所说,对此没有明确的正确答案,但我绝对建议使用 Mockito,原因如下:

  • 它提供了比大多数其他更好的错误描述。失败的验证将返回异常,准确解释发生了哪些其他调用、在何处以及使用了哪些参数,从而使调试变得非常简单。

  • 与 EasyMock 等旧框架相比,它具有明显的优势:Mockito 创建并非常有效地实现了一个比 EasyMock、JMock 和其他人遵循的旧记录/重放/验证过程更好的模拟模型。这是非常直观且非常容易掌握的方法,并且可以使测试更加简洁和易于维护。

  • 它的模型在许多其他语言(例如 Moq)中也直接流行起来,并且更接近于动态语言中的模拟风格。这使得找到其他熟悉它的人变得非常简单,并使您以后使用其他工具更容易。

  • 它正在迅速成为 Java 项目中用于模拟的标准框架:我在许多公司的项目中进行自动化测试,我看到其中有相当多的公司已经在使用 Mockito,并且正在积极迁移到它。搜索“easymock mockito”会出现许多从 EasyMock 迁移到 Mockito 的结果,而在其他方向则没有。

在https://code.google.com/p/mockito/wiki/MockitoVSEasyMock上有更多关于 EasyMock 和 Mockito 之间确切区别的详细信息。

更一般地说,除非绝对必要,否则我会避免使用像 PowerMock 这样的框架。PowerMock 允许您模拟普通模拟框架不会模拟的代码库的各种元素,但是您需要模拟这些元素的事实通常是其他一些底层设计问题的有力指标。如果您发现自己无法在不使用 PowerMock 的情况下测试某些内容,您应该真正考虑是否可以重构被测试代码的结构(例如,摆脱对静态方法的依赖,更好地使用依赖注入来避免调用构造函数等) )。

我还建议您阅读 Martin Fowler 对模拟的出色介绍。就所讨论的框架而言,这现在有点过时了,但仍然通过一些很好的例子对主要概念提供了一个非常好的概述。

于 2013-03-10T21:20:20.823 回答