使用 Mockito-core 创建最终 class 的模拟?

Use Mockito-core for create mock of final class?

find in github 示例如何使用标准 Mockito 生成最终实例 class (BluetoothGatt.class) :

...
@RunWith(RobolectricTestRunner.class)
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class OnBoardingServiceTest {

    private BluetoothGattCharacteristic characteristic;
    private OnBoardingService service;
    private BluetoothGattReceiver receiver = new BluetoothGattReceiver();

    @Before public void initialise() {
        BleDevice bleDevice = mock(BleDevice.class);
        when(bleDevice.getType()).thenReturn(BleDeviceType.WunderbarMIC);
        BluetoothGatt gatt = mock(BluetoothGatt.class);
...

但是来自 Mockito FAQ :

What are the limitations of Mockito

  • Needs java 1.5+
  • Cannot mock final classes
  • ...

我检查它是来自标准 android-sdk 的 BluetoothGatt,所以它看起来像模拟最终版 class。现在我尝试构建项目,确保此测试有效。 它如何使用核心 mockito 在此处制作 mock final class? 如果代码最终无法正常工作,您是否知道如何为 android 仪器测试模拟最终 class? (我已经 )。谢谢

Robolectric 旨在创建和替代 Android 标准 类 的实现,包括最终 类 和方法。在底层,它的工作方式与 PowerMockito 非常相似,使用它自己的类加载器来建立一个有利于它自己的模拟的类路径。

Android 类 在 Robolectric 中的模拟实现被称为 shadows,库不完整;您可能想要 create a custom shadow 满足您的需求。

使用 Mockito 进行方法调用可能仍然不容易,但您可以使用 Robolectric 方法获取影子实例,并编写将方法参数保存到实例中的影子实现(等等) .