我在调查这嘲讽的框架,以用我的项目和有范围缩小到 JMockitMockito.

我注意到 Mockito 投票"最好的模拟框架Java"在计算器.
在比较特征 JMockit's"嘲讽的工具比较矩阵"它的出现, JMockit 有多个不同的特点。

没有任何人有任何具体信息(不意见)上什么 Mockito 可以做哪些不可能实现 JMockit 反之亦然?

有帮助吗?

解决方案

更新月2019: 唯一的 嘲笑框架支持的(默认)通过春天启动Mockito.如果您使用的弹,答案是很明显的。


我想说的竞争之间 JMockitPowerMock, 然后 Mockito.

我会离开"普通"jMock和EasyMock因为他们只使用代理&CGLIB和不使用Java5仪器仪表等较新的框架。

jMock还没有一个稳定释放超过4年。jMock2.6.0需要2年时间从RC1到RC2,然后另一个2年之前,它实际上得到了释放。

关于代理&CGLIB vs仪器仪表:

(EasyMock和jMock)是根据java。郎。反映。代理, 这就需要有一个界面 实施。此外,它们 支持建立模仿的对象 类通过CGLIB子类 代。因此,所说的 类不能是最终的和唯一 重写实例的方法可以 嘲笑。最重要的,但是, 在使用这些工具的 依赖测试代码(即 是的,象其他类上 其中一个给予类下测试 取决)必须加以控制的 试验,以便模拟实例可以 传递给客户的那些 依赖关系。因此,依赖关系 不能简单地进化的 新的运营商在一个客户类 我们想写的单元测试。

最后,技术限制 传统的嘲讽的工具实施 以下设计上的限制 生产码:

  1. 每一类可能需要嘲笑在测试必须执行 一个单独的接口,或不是最终的。
  2. 依赖关系的各类测试必须得到 通过可配置的实例创建 方法(工厂或者一个服务 定位),或者被暴露于依赖 注射。否则,单元的测试不会 可以通过模拟实现 的依赖的部下 测试。
  3. 由于仅实例的方法可以嘲笑,类单元的测试 不能打电话给任何静态的方法 他们的依赖性,也没有实例 他们使用任何构造方法。

以上是复制 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.
在我最喜欢的功能上,可以在良好,正常和严格的模拟控制之间转移的能力。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top