根据这个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-Ins 或 Cmd-N 并选择正确选项来生成委托方法,例如getName()
。有关更详细的示例,请参见此答案。
选项2:使用像Robolectric这样的测试框架
Robolectric提供了Android类(例如Context
和SQLiteDatabase
)的可工作测试替身(称为影子)。 您可能会在默认情况下找到要在测试中模拟的类的影子。
选项3:使用DexOpener
您还可以尝试库DexOpener,具有在Android中模拟最终类的能力。
我刚刚收到一条回复,最终的模拟器在安卓上无法工作。
https://github.com/mockito/mockito/issues/1173#issuecomment-324401986
test/
和androidTest/
之间应该是相同的,你在Android设备上运行测试而不是JVM,这个事实并不会有任何不同,因为它不是Android框架的一部分。 - Michael DoddandroidTestCompile "org.mockito:mockito-inline:+"
来与连接的测试一起使用? - Michael Dodd