【问题标题】:NoClassDefFoundError when running unit test with Gradle task使用 Gradle 任务运行单元测试时出现 NoClassDefFoundError
【发布时间】:2019-11-08 01:04:22
【问题描述】:

我有一个使用 dynamic feature module 的项目,我想通过 gradle 任务在功能模块中运行我的单元测试(出于我的 CI 目的):

./gradlew :feature_product:test

但对于依赖于基础模块中的类的测试,它总是给我NoClassDefFoundError

com.example.android.feature.product.ProductViewTest > on vote change to negative FAILED
java.lang.NoClassDefFoundError: app.BaseView

功能模块中的ProductView 类扩展了基础模块中的BaseView

奇怪的是,在 Android Studio 中运行成功,运行良好。

然后,当我通过命令行运行和运行 Android Studio 时,我注意到日志中有一些不同之处。 Android Studio 中的第一行是generateDebugSources,在我运行./gradlew test 时没有出现

Executing tasks: [:lib_ui:generateDebugSources, ...]

我该如何解决这个问题?当我按下 Ctrl+Shift+R 时,Android Studio 是否与提供的命令./gradlew test 有不同的命令?

【问题讨论】:

  • 我遇到了完全相同的问题。在我的情况下,dynamic-feature-module 测试无法从application-module 中找到任何类。
  • 我也遇到了同样的问题,你们解决了吗?
  • 我设法通过在我的基本模块中不调用任何东西来使用 gradle 运行单元测试

标签: android unit-testing android-studio gradle junit


【解决方案1】:

在进一步搜索此问题后,我发现android-testapp-bundle-samples 项目中也报告了此问题,并且问题跟踪器中也有一个issue

根据issue tracker 中的评论,这个问题已在 Android Gradle 插件 4.1.0 中得到解决。

如果您不想将 AGP 更新到仍处于 alpha 阶段的 4.1.0,请将其添加到功能模块的 build.gradle 为我解决了这个问题,正如 comment 所说:

testRuntimeOnly(files("$projectDir/../b_app/build/intermediates/app_classes/debug/classes.jar"))

【讨论】:

    【解决方案2】:

    如果您认为有必要缺少一个任务,那么首先像下面这样调用它应该可以解决问题:

    ./gradlew :lib_ui:generateDebugSources :feature_product:test
    

    如果有必要,我什至会全力以赴并 assemble 依赖关系,尽管这可能需要更多时间:

    ./gradlew :lib_ui:assemble :feature_product:assemble :feature_product:test
    

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 1970-01-01
      • 2016-01-11
      • 2014-11-11
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2014-07-11
      相关资源
      最近更新 更多