使用Mockito-core来创建final类的模拟对象?

3

我在GitHub里面找到了一个例子,展示了如何使用标准的Mockito创建一个final类(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 可得:

Mockito 的限制有哪些?

  • 需要 java 1.5+
  • 无法 mock final 类
  • ...

我查了一下,它是标准的 Android-sdk 中的 BluetoothGatt,所以看起来像是 final 类。现在我尝试构建项目,确保这个测试可以工作。 如何使用核心 mockito 来模拟 final 类? 如果代码最终不起作用,您有没有任何想法可以为 Android 测试仪测试创建 final 类的模拟?(我已经尝试过PowerMock)。谢谢


我有点难以理解你的问题,但我可以向你保证,核心Mockito无法模拟final类,而PowerMock可以与Mockito一起模拟final类。 - Dawood ibn Kareem
Android的JVM并不是Java的JVM,也许规则在这里有所不同。Mockito FAQ并没有涵盖Android的JVM。 - fge
Mockito的工作原理是创建一个子类,用于模拟。如果一个类可以被子类化,这意味着JVM没有遵守“final”声明。如果Android JVM有这个问题,那真的会让我很惊讶。我的想法是,也许在这个例子中使用的RoboelectricTestRunner执行了一些反射操作来删除“final”,这就是PowerMock所做的。 - Dawood ibn Kareem
可能是如何模拟final类?的重复问题。 - Jared Burrows
1个回答

2

Robolectric 的设计初衷是创建和替代 Android 标准类,包括 final 类和方法。在底层,它的工作方式与 PowerMockito 非常相似,使用自己的 classloader 来建立一个 classpath,优先使用自己的模拟。

在 Robolectric 中,对 Android 类的模拟实现称为 shadows,该库不完整;您可能需要创建自定义 shadow以满足您的需求。

尽管使用 Mockito 进行方法调用可能并不容易,但您可以使用 Robolectric 方法来获取 shadows 实例,并编写 shadow 实现将方法参数保存到实例中(等等)。


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