之间的比较Mockito vs JMockit-为什么是Mockito投票比JMockit?[关闭]
-
29-09-2019 - |
题
我在调查这嘲讽的框架,以用我的项目和有范围缩小到 JMockit 和 Mockito.
我注意到 Mockito 投票"最好的模拟框架Java"在计算器.
在比较特征 JMockit's"嘲讽的工具比较矩阵"它的出现, JMockit 有多个不同的特点。
没有任何人有任何具体信息(不意见)上什么 Mockito 可以做哪些不可能实现 JMockit 反之亦然?
解决方案
更新月2019: 唯一的 嘲笑框架支持的(默认)通过春天启动 是 Mockito.如果您使用的弹,答案是很明显的。
我想说的竞争之间 JMockit 和 PowerMock, 然后 Mockito.
我会离开"普通"jMock和EasyMock因为他们只使用代理&CGLIB和不使用Java5仪器仪表等较新的框架。
jMock还没有一个稳定释放超过4年。jMock2.6.0需要2年时间从RC1到RC2,然后另一个2年之前,它实际上得到了释放。
关于代理&CGLIB vs仪器仪表:
(EasyMock和jMock)是根据java。郎。反映。代理, 这就需要有一个界面 实施。此外,它们 支持建立模仿的对象 类通过CGLIB子类 代。因此,所说的 类不能是最终的和唯一 重写实例的方法可以 嘲笑。最重要的,但是, 在使用这些工具的 依赖测试代码(即 是的,象其他类上 其中一个给予类下测试 取决)必须加以控制的 试验,以便模拟实例可以 传递给客户的那些 依赖关系。因此,依赖关系 不能简单地进化的 新的运营商在一个客户类 我们想写的单元测试。
最后,技术限制 传统的嘲讽的工具实施 以下设计上的限制 生产码:
- 每一类可能需要嘲笑在测试必须执行 一个单独的接口,或不是最终的。
- 依赖关系的各类测试必须得到 通过可配置的实例创建 方法(工厂或者一个服务 定位),或者被暴露于依赖 注射。否则,单元的测试不会 可以通过模拟实现 的依赖的部下 测试。
- 由于仅实例的方法可以嘲笑,类单元的测试 不能打电话给任何静态的方法 他们的依赖性,也没有实例 他们使用任何构造方法。
以上是复制 http://jmockit.org/about.html .另外,它本身之间进行比较(JMockit),PowerMock,并Mockito在几个方面:
现在有其他嘲讽的工具 Java这也能克服的 限制传统的人, 它们之间的PowerMock,jEasyTest, MockInject.那个来接近 要特征设置的JMockit是 PowerMock,因此我将简要评估 这里的(此外,其他两个都是 更多的限制,似乎不是 积极开发了).
JMockit vs PowerMock
- 首先,PowerMock没有提供一个完整的API for嘲讽, 但不是作为一个扩展到 另一个工具,它目前可以 EasyMock或Mockito.这显然是 一个利用现有用户的 这些工具。
- JMockit,另一方面,提供了全新的Api,虽 其主要API(预期)是类似的 两EasyMock和jMock.虽然这个 创建了一个较长的学习曲线, 还允许JMockit提供一个 更简单、更一致和更容易 使用。
- 相比JMockit期望API,PowerMock API是 更多"低级",迫使用户 找出并指定其类 需要准备用于测试(与 该@PrepareForTest({ClassA.class, ...})注释)和要求 具体API调处理 各种各样的语言 可能存在生产 代码:静态的方法 (mockStatic(ClassA.class)), 构造 (抑制(constructor(ClassXyz.class))), 构造的调用 (expectNew(AClass.class)),部分 嘲笑(createPartialMock(ClassX.class, "methodToMock")),等等。
- 与JMockit的期望,所有种类的方法和构造是 嘲笑在一个纯粹的声明的方式, 有部分嘲讽的指定的通过 经常表达的@嘲笑 注释,或通过简单的"联合国的嘲笑" 成员没有记录 期望;也就是说,开发商 只是宣布一些共享"模拟 领域",用于测试类,或者一些 "当地的模拟场"和/或"模拟 参数"对个人的测试 方法(并在这最后一种情况下 @嘲笑的注释往往不会 需要)。
- 一些能力提供JMockit,例如支持对于嘲讽 平等和哈希码,重写 方法,和其他人,目前没有 支持在PowerMock.此外,还有 没有相当于JMockit的能力 捕获情况和模拟 实现指定的基 类型作为测试执行,而不 测试本身的代码有任何 知识的实际执行情况 课程。
- PowerMock使用的定义类装载机(通常每一个测试类) 为了产生修改的版本 在嘲笑课程。这种沉重的使用 的定义类机可能会导致 冲突第三方的库, 因此需要时使用 @PowerMockIgnore("软件包。到。是。忽略") 注解在测试的课程。
- 使用的机制JMockit(运行时检测过 "Java剂")是简单和更安全, 虽然它不需要通过一个 "-javaagent"的参数来JVM时 发展中on JAVA1.5;在JAVA1.6+ (总是可以用于 发展中,即使部署在一个 旧版本),没有这样 要求,因为JMockit可以 透明地载Java剂 需求使用附加API。
最近的另一个工具是嘲讽 Mockito.虽然它并不试图 克服限制老年 工具(jMock,EasyMock),它不会 介绍一个新式的行为 测试与嘲笑.JMockit还 支持这种替代风格, 通过核查。
JMockit vs Mockito
- Mockito依赖于明确呼吁其API以独立代码 之间的记录(时(...))和 验证(验证(...))的阶段。此 意味着任何调用一个模拟 目中测试的代码也需要 一个呼叫的嘲讽。此外,这往往会导致 重复性的时候(...), 验证(嘲笑)...呼叫。
- 与JMockit,没有类似的呼吁存在。当然,我们有新的 NonStrictExpectations()以及新的 核查()constructor呼叫,但是 他们只发生一次,每次测试 (通常的),而是完全 独立的调用 嘲笑方法和构造.
- 该Mockito API包含若干不一致之处使用的语法 调用来嘲笑的方法。在 记录相,我们呼吁喜欢 当(嘲笑。mockedMethod(args))...同时 在验证阶段的这个同样的电话 将编写为 验证(嘲笑).mockedMethod(arg).请注意,在第一种情况下 调用mockedMethod是 直接在模拟对象,而在 第二种情况下,它是由上 对象返回的验证(嘲笑).
- JMockit没有这样的不一致,因为调用 嘲笑方法是总是 直接在嘲笑实例 自己。(除有一个例外:匹配调用相同的 嘲笑实例,onInstance(嘲笑) 呼吁被使用,导致这样的代码 onInstance(嘲笑).mockedMethod(args);大多数的测试,不需要使用这个, 虽然。)
- 就像其他的嘲讽的工具,这依靠的方法 链/包裹,Mockito还运行 成不一致的法时碰 无效的方法。例如,你写的 当(mockedList.获得的(1))。thenThrow(新 异常());对于非无效 方法,并doThrow(新 异常()).当(mockedList).明();对于无效的一个。与JMockit,它的 总是同样的语法:mockedList.明();结果=new 异常();.
- 又一个不一致发生在使用Mockito间谍:"嘲笑" 允许真正的方法 执行上的从事间谍活动的实例。对于 例如,如果有间谍指的是一个空的 名单,那么,而不是写 当(间谍。获得(0)).thenReturn("foo")你 将需要写 doReturn("foo").当(间谍).获得(0).与 JMockit的动态功能嘲讽 提供了类似的功能 间谍,但是,如果没有这种问题因为 真实的方法只得到执行期间 重播阶段。
- 在EasyMock和jMock,第一嘲讽Api Java,重点是 完全记录的预期 调用的嘲笑方法, 模拟对象,(默认)不 允许意想不到的调用。那些 Api还提供记录的 允许调用于模拟对象 这样做的允许意想不到的调用, 但是,这被视为一个第二级 功能。此外,与这些 工具是没有办法到明确 验证调用来嘲笑之后 代码下的试验是行使。所有这些 核查执行隐含地 和自动的。
- 在Mockito(并且还在Unitils模拟),相反的观点是 采取的。所有调用来嘲笑的对象 这一过程中可能发生的测试, 是否记录或者没有,是允许的, 从来没有期望。验证 执行明确的代码后 在试验是行使,从来没有 自动的。
- 这两种方法过于极端,因而少于最佳的。JMockit期望&核查 是的只API,允许 开发无缝选择 最佳组合的严格(预期 通过默认)并非严格的(允许的 默认)模拟调用于每 测试。
- 要更加明确,Mockito API具有以下缺点。如果你 需要验证一个调用到 非无效嘲笑方法期间发生的事情 试验,但试验要求 返回值,方法是 不同于默认的 返回的类型,然后Mockito测试 会有重复代码:一个 当(嘲笑。someMethod()).thenReturn(z) 通话记录中的阶段,和一个 验证(嘲笑).someMethod()在 验证阶段。与JMockit,一个严格的 期望可以总是被记录下来, 它不会需要明确 验证。或者,可调用 最约束(次=1)可以 指定的任何记录的非严格 预期(与Mockito这样的 制约因素可能只指定在一个 验证(模拟,约束)call)。
- Mockito具有较差的语法核查以及充分 核查(即,检查 所有调用来嘲笑的对象 明确地验证).在第一 种情况下,一个额外对象的需要 创建,并要求验证做 它:序序=序(mock1, mock2,...).在第二种情况下,电话 像verifyNoMoreInteractions(嘲笑)或 verifyZeroInteractions(mock1,mock2) 需要作出。
- 与JMockit,你只要写新的VerificationsInOrder()或新的 FullVerifications()而不是新的 核查()(或新的 FullVerificationsInOrder()结合 这两个要求)。没有必要指定 它嘲笑的对象是参与。没有 额外的嘲讽API话。并且作为一个 奖金,通过调用 unverifiedInvocations()内部一个 订购的核查块,你可以 执行了相关的核查 这是根本不可能在Mockito.
最后,JMockit测试工具包 有一个 更广泛的范围 和 更加雄心勃勃 目标 比其他嘲讽的工具包, 为了提供一个完整的, 复杂的开发测试 解决方案。一个很好的API for嘲讽,甚至 没有人为限制,是不是 足够的为生产创造的 测试。IDE无关的、便于使用, 和良好的综合复盖代码工具 也是至关重要的,这是什么 JMockit复盖的目的是提供。另一块的开发测试 工具箱将成为更有用的 作为试验套房增长的尺寸的 能够逐步重新运行测试 后一本地化改变生产 代码;这也包括在的 复盖率的工具。
(授权,该来源可能会偏见,但以及...)
我说去 JMockit.这是最容易使用的、灵活的,并适用于几乎所有情况下甚至是困难的和方案的时候,你不能控制该类测试的(或者你不能打破它由于兼容性原因,等等)。
我的经验与JMockit已经非常积极的。
其他提示
我曾与Mockito和Jmockit合作,我与他们的经验是:
MOCKITO:
- 隐式模拟( - >更好的可用性,但没有检测到未允许的方法的危险)
- 显式验证
Easymock:
- 解释嘲笑
- 隐式验证
jmockit:
- 两者都支持
此外,Jmockit的其他好处:
- 如果您要嘲笑静态方法/构造函数等(例如,不带UT扩展非常旧的旧代码库),您将有两个选择:1)带有PowerMock扩展名的Mockito/EasyMock或2)JMockit
- 内置覆盖报告
我个人更喜欢Jmockit,我认为它更具功能更丰富和灵活,但需要更陡峭的学习曲线。通常有多种方法可以实现相同的模拟效果,并且在设计模拟时需要更多的护理。
我使用jmockit 只要 因为它是deencapsultation.class中的反射库。我实际上喜欢Mockito的风格,但是我拒绝更改代码并弄乱我的API,以便有限的测试框架可以实现。我喜欢测试所有代码,因此无法轻松测试私有方法的框架不是我想要使用的。
我被 本文
经过一条(公认的)学习曲线之后,Jmockit现在是我的Mocks的主要单元测试框架。
为了轻松测试我们的旧代码库(带有大量静态方法的调用等),Jmockit非常宝贵。 [无耻的插头 文章 在我的博客上
我个人更喜欢 Easymock.
在我最喜欢的功能上,可以在良好,正常和严格的模拟控制之间转移的能力。