【问题标题】:How to mock Final Clases under java/androidTest using Mockito2?如何使用 Mockito 2 在 java/android 测试下模拟最终类?
【发布时间】:2018-02-01 06:18:51
【问题描述】:

Final 类在我在 gradle 中定义时可以在 java/test 下模拟:

testCompile "org.mockito:mockito-inline:+"

如何在 java/androidTest 下模拟 final 类?此解决方案不起作用:

androidTestCompile "org.mockito:mockito-android:+"

你有什么想法吗?

【问题讨论】:

  • 这不是重复。我想知道Android平台是否可以这样做。
  • test/androidTest/ 之间的 Mockito 行为应该是相同的,事实上,您在 Android 设备而不是 JVM 上运行测试应该没有区别,因为它不是 Android 的一部分框架。
  • Mockito 2 {testCompile "org.mockito:mockito-core:+" and androidTestCompile "org.mockito:mockito-android:+" } 没有引入模拟最终类。为此,我需要使用 org.mockito:mockito-inline:+ 而不是 org.mockito:mockito-core。它适用于 test/,但不适用于 androidTest/。我想知道我需要做什么更改才能在 androidTest 包下启用它。
  • 通过添加androidTestCompile "org.mockito:mockito-inline:+"使用内联测试?
  • 当我这样做时,我收到一个异常,对于 androidTestCompile 我应该使用 org.mockito:mockito-android:+。我还发现了添加文件的提示:java/com/(androidTest)resources/mockito-extensions/org.mockito.plugins.MockMaker 包含值 mock-maker-inline。但它也不起作用。

标签: android class testing mockito final


【解决方案1】:

根据this GitHub issuemockito-android 不支持模拟最终类。

来自图书馆维护者之一:

目前没有真正的可能性使 [模拟最终类] 在 Android 中工作,因为它缺少我们正在运行的检测 API。 Android VM 不是标准 VM,仅实现 Java 规范的一个子集。只要谷歌不选择扩展它的JVM,恐怕这个功能就行不通了。

根据您的用例,有一些替换它的选项。

选项 1:使用包装器

如果您希望模拟 final Android 系统类,如 BluetoothDevice,您可以简单地围绕该类创建一个非最终包装器,并在您的代码中使用 BluetoothDeviceWrapper 而不是 BluetoothDevice

class BluetoothDeviceWrapper {

   private final BluetoothDevice bluetoothDevice;

   BluetoothDeviceWrapper(BluetoothDevice bluetoothDevice) {
       this.bluetoothDevice = bluetoothDevice;
   }

   public String getName() {
       return bluetoothDevice.getName();
   }
}

专业提示:您可以使用 Android Studio 的 Generate / Delegate 方法为您生成像 getName() 这样的委托方法,方法是按 Alt-InsCmd-N 并选择正确的选项。有关更详细的示例,请参阅 this answer

选项 2:使用 Robolectric 等测试框架

Robolectric 提供诸如ContextSQLiteDatabase 等Android 类的工作测试替身(称为影子)。您可以在开箱即用的测试中找到您尝试模拟的类的影子。

选项 3:使用 DexOpener

您还可以尝试使用库 DexOpener 来模拟 Android 中的最终类。

【讨论】:

  • Robolectric 是这里的答案。
  • 我会尝试使用包装器,我开始使用 espresso,我想坚持使用这个 android 原生框架。谢谢!
  • @JasonTholstrup 应该使用 Espresso 之类的库在设备上运行的 E2E 测试怎么样?我认为选项 3 在那里很有用。
  • 如果是 E2E 测试,你不是在嘲笑吗?
【解决方案2】:

您现在可以使用dexmaker-mockito-inline。有关 Mockito 变体及其功能的详细信息,请参阅 here

【讨论】:

    【解决方案3】:

    我刚收到回复说最终的模拟制作器无法在 Android 上运行。

    https://github.com/mockito/mockito/issues/1173#issuecomment-324401986

    【讨论】:

    • 我们可以使用 PowerMock 实现同样的效果吗?
    【解决方案4】:

    final 类、对象、构造函数都可以用 mockk 模拟 https://mockk.io/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多