如何在Java/AndroidTest中使用Mockito2模拟Final类?

11

在此输入图片描述在gradle中定义以下内容,我们可以对Java/Test下的final类进行模拟:

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

如何在Java/AndroidTest下模拟final类?以下的解决方案无法使用:

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

你有什么想法吗?


这并不是重复的问题。我想知道在Android平台上是否有可能实现。 - user1685503
Mockito行为在test/androidTest/之间应该是相同的,你在Android设备上运行测试而不是JVM,这个事实并不会有任何不同,因为它不是Android框架的一部分。 - Michael Dodd
Mockito 2 {testCompile "org.mockito:mockito-core:+" and androidTestCompile "org.mockito:mockito-android:+" } 不支持对 final 类进行模拟。为了实现这一点,我需要使用 org.mockito:mockito-inline:+ 而不是 org.mockito:mockito-core。在测试中它可以正常工作,但在 androidTest/ 中却不能。我想知道我需要做哪些更改才能在 androidTest 包下启用它。 - user1685503
使用androidTestCompile "org.mockito:mockito-inline:+"来与连接的测试一起使用? - Michael Dodd
当我这样做时,我收到一个异常,说对于androidTestCompile,我应该使用org.mockito:mockito-android:+。我还发现了一个提示,要添加一个文件:java/com/(androidTest)resources/mockito-extensions/org.mockito.plugins.MockMaker,其中包含值mock-maker-inline。但它也不起作用。 - user1685503
4个回答

8

根据这个GitHub问题,在mockito-android中不支持模拟final类。

来自库维护者之一的说法:

目前在Android上无法实现[模拟final类],因为它缺少我们正在操作的仪器API。 Android虚拟机不是标准虚拟机,仅实现Java规范的子集。 只要Google不选择扩展其JVM,我恐怕这个功能将无法工作。

根据您的用例,有一些替代方案。

选项1:使用包装器

如果您想模拟一个final Android系统类,例如BluetoothDevice,则可以简单地创建一个非final包装器来包含该类,并且在您的代码中使用BluetoothDeviceWrapper代替BluetoothDevice

class BluetoothDeviceWrapper {

   private final BluetoothDevice bluetoothDevice;

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

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

专业提示:您可以使用Android Studio的 Generate / Delegate 方法,通过按下 Alt-InsCmd-N 并选择正确选项来生成委托方法,例如getName() 。有关更详细的示例,请参见此答案

选项2:使用像Robolectric这样的测试框架

Robolectric提供了Android类(例如ContextSQLiteDatabase)的可工作测试替身(称为影子)。 您可能会在默认情况下找到要在测试中模拟的类的影子。

选项3:使用DexOpener

您还可以尝试库DexOpener,具有在Android中模拟最终类的能力。


2
Robolectric就是答案。 - Jason Tholstrup
我会尝试使用包装器,我开始使用Espresso并且希望坚持使用这个Android原生框架。谢谢! - user1685503
@JasonTholstrup 那么对于需要在设备上使用Espresso等库运行的E2E测试呢?我认为选项3在这种情况下很有用。 - David
如果这是一个端到端测试,你不会进行模拟吗? - Jason Tholstrup

4

0

0

我们能否使用PowerMock来实现相同的功能? - CR Sardar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接