Android插桩测试中Mockito初始化MockMaker报错问题咨询
Android Instrumentation 测试 Mockito 初始化报错解决方案
问题根因
mock-maker-inline是面向标准JVM环境的MockMaker实现,依赖Java Instrumentation API与JVM专属类库,Android的Dalvik/ART虚拟机不支持这套能力。手动添加该配置后,即使引入了mockito-android依赖,Mockito也会强制加载JVM专用的InlineByteBuddyMockMaker,最终抛出类找不到的异常。
解决方法
根据是否需要mock final类、静态方法,二选一即可:
方案1:不需要mock final类、静态方法
直接删除手动创建的src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMaker配置文件。
mockito-android依赖已经内置了适配Android虚拟机的MockMaker实现,删除错误配置后会自动加载适配版本,支持mock所有非final类(示例中给类加open关键字的写法符合要求),不需要额外配置即可正常运行测试。
方案2:需要mock final类、静态方法(使用inline mock能力)
替换原有Mockito依赖,使用适配Android的inline mock实现,不需要手动添加任何MockMaker配置文件:
- 移除原有
mockito-android依赖,避免类冲突 - 添加dexmaker提供的Android版inline mock依赖,版本和使用的Mockito主版本对齐即可:
def mockitoVersion = "3.10.0" androidTestImplementation "com.linkedin.dexmaker:dexmaker-mockito-inline:$mockitoVersion"
该依赖内置了适配ART虚拟机的inline mock实现,不需要额外配置即可支持final类、静态方法的mock,不会触发Instrumentation API相关错误。
注意事项
- 本地JVM单元测试(
src/test目录下的测试)如果需要使用mockito-inline,对应的MockMaker配置文件必须放在src/test/resources路径下,不要放到androidTest的资源目录,否则会导致instrumentation测试运行时加载错误的MockMaker实现。 - 提供的测试代码逻辑本身没有问题,mock生成的对象基本类型字段默认值为0,配置修复后断言可正常通过。
内容的提问来源于stack exchange,提问作者Suraj Vaishnav
相关产品推荐
相关产品推荐

