【问题标题】:Mockito and final equals() method in class - is it mockable?类中的 Mockito 和 final equals() 方法 - 它是可模拟的吗?
【发布时间】:2013-10-16 23:20:13
【问题描述】:

我想使用 Mockito 模拟来自其他库的类。我读到 Mockito 依赖于 equals 方法的特定(我认为是 CGLIB 提供)实现。不幸的是,这个外部类有用 final 修饰符表示的 equals(),并且它的主体中存在抛出异常。

当我尝试模拟这个类时,我总是从这个方法中得到异常。 CGLIB 显然不能通过 final,调用真正的方法。

有什么想法吗?我能做些什么来使用 Mockito 模拟这个类?也许其他图书馆会处理它?

[EDIT] 快速解释:我不想模拟equals(),我检查其他方法。问题是 mockito 内部使用 equals(),我不知道是为了什么。由于 equals() 是最终的,所以调用真正的方法时会抛出异常。我曾希望在 mockito 中有一些设置“不要使用 equals()”:-) 感谢您的回答,我明天会仔细阅读。

【问题讨论】:

  • 有什么异常?
  • 不,你不能直接用 Mockito 模拟这样的类。当您在应用程序中使用它时,您是否能够包装它,然后模拟包装器?
  • 是的,包装器将是解决方案,但在这种情况下,我必须使用该类或子类,以便保留棘手的 equals()。反正我是手工写的 mock,幸好那个类不是 final 的,所以我扩展了它。

标签: java mocking mockito


【解决方案1】:

此矩阵显示了不同框架支持的功能:

矩阵here的外部链接。

据此,只有PowerMockJMockit 可以模拟final 方法。

【讨论】:

    【解决方案2】:

    Mockito 不能模拟最终方法。显然PowerMock 可以。

    一个 hacky 解决方法可能是创建一个非最终方法,该方法委托给最终的 equals 方法并模拟它。

    【讨论】:

      【解决方案3】:

      我相信使用 PowerMock 和 Mockito API 模拟最终方法的步骤是:使用 @RunWith(PowerMockRunner.class) 运行测试,然后准备要模拟的类 @PrepareForTest(ClassToBeMocked.class)。之后,模拟您的对象并使用when 方法模拟equals 方法。

      我认为如果你不在你的测试类中使用PrepareForTest注解它是行不通的。

      【讨论】:

      • 我不喜欢 Powermock,因为我将它与模拟静态方法相关联,这是邪恶的。但在这种情况下,它的使用可能是合理的。反正我是手写模拟的。
      猜你喜欢
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多