Mockito无法Mock任何类的Android测试问题求助
Mockito无法Mock类的问题解决
问题现象
在Android测试中尝试Mock类时,Mockito持续抛出错误:
org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class com.test.test.DataMockito can only mock non-private & non-final classes.
即使给Kotlin类添加open修饰符,或使用默认非final的Java类,错误依然存在。当前依赖配置如下:
testImplementation 'org.mockito:mockito-inline:2.8.47' testImplementation 'org.mockito:mockito-core:5.4.0' androidTestImplementation 'org.mockito:mockito-android:5.4.0'
核心原因
最关键的问题是Mockito依赖版本不兼容:mockito-inline的版本(2.8.47)远低于mockito-core和mockito-android的版本(5.4.0),版本冲突导致mockito-inline的字节码修改功能无法正常工作,Mockito依然无法处理final类/方法。此外,仪器化测试(androidTest)场景下,需要额外配置才能启用inline模式。
解决方案
1. 统一所有Mockito依赖版本
将mockito-inline的版本与mockito-core、mockito-android保持一致,确保依赖兼容:
testImplementation 'org.mockito:mockito-inline:5.4.0' testImplementation 'org.mockito:mockito-core:5.4.0' androidTestImplementation 'org.mockito:mockito-android:5.4.0'
2. 仪器化测试(androidTest)额外配置
如果是在仪器化测试中Mock类,需要在Module级别的build.gradle中添加配置,启用Mockito的inline模式:
android { defaultConfig { testInstrumentationRunnerArguments = ["mockito-inline": "true"] } }
3. 规范Mock对象初始化
确保测试类中正确初始化Mock对象,推荐使用@Mock注解配合MockitoAnnotations.openMocks(this):
class SampleTest { @Mock lateinit var testOpenClass: Test @Before fun setup() { MockitoAnnotations.openMocks(this) } @Test fun testMockBehavior() { `when`(testOpenClass.say()).thenReturn("Mocked result") assert(testOpenClass.say() == "Mocked result") } }
4. 清理缓存并重新构建
依赖缓存可能导致版本不生效,执行以下操作:
- 打开Android Studio,选择
File -> Invalidate Caches...,点击Invalidate and Restart - 命令行执行:
./gradlew clean build
内容的提问来源于stack exchange,提问作者Julius Babies
相关产品推荐
相关产品推荐

