Robolectric集成JaCoCo运行单元测试报错且无法生成覆盖率报告
问题排查解决方法
错误根因
报错是Guava版本冲突导致的,错误日志中的NoSuchMethodError指向Guava的ImmutableList.sortedCopyOf方法,原因是Robolectric 4.3.1依赖高版本Guava,和项目中其他依赖(旧版JaCoCo、Android构建工具自带依赖)引入的低版本Guava发生了冲突,类加载时优先加载了没有对应方法的低版本Guava,触发了初始化失败。
解决步骤
- 第一步:强制指定测试环境的Guava版本
在app模块build.gradle的依赖中添加高版本兼容Guava,强制覆盖冲突的低版本:
dependencies { // 原有依赖保留,新增下面配置 testImplementation ('com.google.guava:guava:27.1-android') { force = true } }
- 第二步:升级JaCoCo版本
你当前配置中注释了JaCoCo版本,使用的默认旧版本和Robolectric兼容性差,打开jacoco.gradle中注释的jacoco配置块,修改为稳定兼容的版本:
jacoco { toolVersion = "0.8.8" }
- 第三步:修正class文件查找路径(适配AGP 3.6及以上版本)
Android Gradle Plugin 3.6之后,编译后的class文件存储路径从intermediates/classes/变更为intermediates/javac/,你原有配置的路径错误,会导致后续覆盖率报告无法正常生成,将jacoco.gradle中的classDirectories配置修改为:
classDirectories.from = fileTree( dir: "${project.buildDir}/intermediates/javac/${name}", excludes: ['**/R.class', '**/R$*.class', '**/*$ViewInjector*.*', '**/*$ViewBinder*.*', '**/BuildConfig.*', '**/Manifest*.*'] )
- 第四步:验证生效
修改完成后执行./gradlew clean清理项目缓存,再执行覆盖率任务即可,比如debug版本的覆盖率任务为./gradlew testDebugUnitTestCoverage,测试可正常运行且覆盖率报告生成在build/reports/jacoco/目录下。
内容的提问来源于stack exchange,提问作者Prat
相关产品推荐
相关产品推荐

