You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito无法Mock任何类的Android测试问题求助

Mockito无法Mock类的问题解决

问题现象

在Android测试中尝试Mock类时,Mockito持续抛出错误:

org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class com.test.test.Data

Mockito 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 23:47:30