Kotlin & Mockito单元测试在Gradle中失败,本地Android Studio运行正常
这种情况我之前也踩过坑——明明IDE里跑单元测试一切正常,用./gradlew test命令行执行就报错,核心原因大概率是Mockito inline扩展的配置没有完全生效,或者存在依赖、缓存的隐性问题。下面是几个你可以逐一排查的关键点:
1. 手动添加Mockito inline的配置文件
仅仅在Gradle里引入mockito-inline依赖有时候还不够,你需要创建一个配置文件来明确启用inline mock maker:
- 在项目中创建路径:
src/test/resources/mockito-extensions - 在该目录下新建文件
org.mockito.plugins.MockMaker - 文件内只需要写入一行内容:
mock-maker-inline
IDE运行测试时可能会自动识别依赖并启用扩展,但Gradle命令行执行时需要这个配置文件明确指定mock策略,否则还是会用默认的mock maker,自然无法处理final类。
2. 确保Mockito依赖版本完全一致
检查你项目中所有Mockito相关依赖(比如mockito-core)的版本是否和mockito-inline完全匹配。如果存在版本冲突,Gradle会自动选择某一个版本,可能导致inline扩展被旧版的核心依赖覆盖。
你可以用./gradlew dependencies命令查看testImplementation的依赖树,若发现不同版本的Mockito组件,要么统一所有Mockito依赖的版本,要么在mockito-inline依赖中排除旧版核心库:
testImplementation("org.mockito:mockito-inline:2.18.0") { exclude group: 'org.mockito', module: 'mockito-core' }
3. 清理Gradle缓存重试
有时候Gradle的缓存会导致依赖没有正确更新,你可以尝试清理缓存后重新运行测试:
./gradlew clean test --no-build-cache
4. 确认测试变体的依赖配置
如果你是针对特定构建变体(比如debug、release)运行测试,要确保mockito-inline依赖是添加到对应变体的测试配置中(比如debugTestImplementation)。不过一般单元测试用全局的testImplementation就足够,但如果你的测试绑定了特定变体,可以检查下依赖配置是否正确。
5. 检查Android Gradle Plugin版本兼容性
部分旧版本的AGP可能和Mockito inline扩展存在兼容性问题,如果你用的是较老的AGP版本(比如低于7.0),可以尝试升级到稳定版本,大概率能解决隐性的兼容问题。
按照上面的步骤排查一遍,应该就能解决Gradle命令行运行时无法mock final类的问题了。
内容的提问来源于stack exchange,提问作者Jackie Ho

