IntelliJ运行Scala单元测试报java.lang.NoClassDefFoundError: scoverage/Invoker$错误
A needed class was not found. This could be due to an error in your runpath. Missing class: scoverage/Invoker$ java.lang.NoClassDefFoundError: scoverage/Invoker$
根因说明
这个错误的本质是IntelliJ执行测试的逻辑和sbt原生逻辑不一致:IntelliJ编译测试代码时默认注入了scoverage覆盖率插桩逻辑,但运行测试时没有自动把scoverage的runtime依赖加入classpath,所以会出现类找不到的错误;sbt运行正常是因为sbt的scoverage插件会自动完成依赖引入、插桩、classpath配置的全流程,没有配置缺失问题。
可行修复方案
- 方案1:关闭默认测试覆盖率开关
打开File -> Settings -> Build, Execution, Deployment -> Coverage,取消勾选 Enable coverage in test runs by default,删除所有已存在的旧测试运行配置,右键测试类/方法重新生成配置运行即可。 - 方案2:强制IDEA使用sbt shell执行测试
打开File -> Settings -> Build, Execution, Deployment -> Build Tools -> sbt,勾选 Use sbt shell for build and run,后续IDEA运行测试会直接调用sbt原生命令,和命令行执行逻辑完全一致,不会出现类缺失问题。该方案是最稳妥的适配方式,不会出现IDE和构建工具行为不一致的各类问题。 - 方案3:手动补全测试范围的scoverage依赖
如果需要保留IDEA内置的覆盖率统计能力,在项目的build.sbt中添加对应版本的scoverage runtime依赖:
添加后刷新sbt项目,重新运行测试即可。// 版本需要和你项目中sbt-scoverage插件的版本完全匹配 libraryDependencies += "org.scoverage" %% "scalac-scoverage-runtime" % "2.0.11" % Test - 方案4:清理缓存重新导入项目
如果上述方案都不生效,点击File -> Invalidate Caches...,勾选 Clear file system cache and local history 后重启IDEA,等待项目重新索引完成后再运行测试。
内容的提问来源于stack exchange,提问作者Donald Duck
相关产品推荐
相关产品推荐

