【问题标题】:Use Mockito-core for create mock of final class?使用 Mockito-core 创建最终类的模拟?
【发布时间】:2015-03-28 08:10:32
【问题描述】:

find in github 示例如何使用标准 Mockito 制作最终类 (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+
  • 无法模拟最终课程
  • ...

我检查了它是来自标准 android-sdk 的 BluetoothGatt,所以它看起来像模拟最终类。现在我尝试构建项目,确保这个测试有效。 它如何使用核心模拟在这里制作模拟最终课程? 如果它的代码最终不起作用,你知道如何模拟最终类以进行 android 仪器测试吗? (我已经是try PowerMock)。谢谢

【问题讨论】:

  • 我无法准确理解您的要求;但我可以向你保证,核心 Mockito 不能模拟最终类,而 PowerMock 可以与 Mockito 一起模拟最终类。
  • Android JVM 不是 Java 的;也许那里的规则不同。 Mockito 常见问题解答不包括 Android 的 JVM。
  • 嗯,Mockito 通过创建一个用于模拟的子类来工作。如果一个类能够被子类化,则意味着 JVM 不遵守 final 声明。如果 Android JVM 出现这种故障,我真的会感到惊讶。我唯一的想法是,本示例中使用的 RoboelectricTestRunner 可能会使用一些反射魔法来删除 PowerMock 所做的 final

标签: java android mocking mockito android-instrumentation


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多