【问题标题】:How to use code in androidTest directory of another module如何使用另一个模块的androidTest目录中的代码
【发布时间】:2014-12-06 14:23:32
【问题描述】:

我在我的 AndroidStudio 项目中添加了两个模块:

app-base
|
|----src
      |____androidTest
                |________MyTestBase.java          

app
|
|----src
      |____androidTest
                |________MyTest.java

在app-base的androidTest中定义了一些常用的测试类,在app'androidTest中使用。

我已尝试在应用的 build.gradle 中添加以下代码:

    evaluationDependsOn(':app-base')

    compile project(':app-base')

    androidTestCompile project(':app-base')

我在 settings.gradle 中包含了 app-base 和 app,gradlew projects 的输出是:

Root project 'MyProject'
+--- Project ':app-base' 
+--- Project ':app'

这种方式编译没有错误,但是在ide中运行MyTest时,提示找不到类MyTestBase。

你知道怎么了吗?任何想法表示赞赏。谢谢。

【问题讨论】:

  • 您是否定义了合适的 settings.gradle 文件? gradlew projects 的输出是什么?查看Gradle documentation,了解有关如何设置多项目构建的更多信息。
  • 依赖另一个项目的测试代码绝对是不典型的。您必须明确依赖项目 testCompile 配置。试试androidTestCompile project(path: ':app-base', configuration: 'androidTestCompile')

标签: android testing gradle


【解决方案1】:

我一直在寻找解决此问题的方法,终于找到了适合我的方法。

这将允许您将常见的测试类放在另一个模块中。

android {
    ...

    sourceSets {
        androidTest.java.srcDirs += ["${project('match the module name that is currently in the dependencies').projectDir}/src/androidTest/java"]
    }
}

所以对于上面的例子,它可能看起来像

androidTest.java.srcDirs += ["${project(':appbase').projectDir}/src/androidTest/java"]

【讨论】:

  • 顺便说一句,它可以工作,但 Android Studio 无法识别来自其​​他模块的文件。只是因为该文件的导入 stmt 下方的红色波浪线而令人讨厌。
  • @sudocoder,红色波浪线听起来像该模块在正常构建下无法正确编译。有什么错误?您是否缺少该模块中的依赖项
  • 如果在运行测试时可以正常运行,则表示在进行android测试编译时可以正确编译并且不相关。此代码编译原始模块依赖项下的代码,而不是代码所在模块的依赖项。
  • 最好的解决方案是如果您要共享的课程很少而不是创建单独的模块,谢谢:)
  • 我决定改用来自@ben75 的其他解决方案,因为我担心红色的波浪线会使这个解决方案让其他长期维护它的人感到困惑。
【解决方案2】:

我建议你采取以下策略:创建一个新模块test-utils 并将MyTestBase.java 放在该模块的主要来源中。

test-utils
|
|----src
      |____main
             |________MyTestBase.java

然后你将这个test-utils 作为测试依赖添加到所有需要它的模块中

androidTestCompile project(':test-utils')

【讨论】:

  • 是的,我曾经想过解决方案。我认为这行得通。但是我需要为几个类添加一个新模块。这是不可接受的。但无论如何感谢:)
  • 恕我直言,新模块并不是什么大事。替代解决方案是:在每个模块中重复代码或使用一些相对路径为 androidTest 定义多个源目录,例如:../app-base/src/androidTest/java/(恕我直言,它们都更糟)
  • 我尝试了这种方法,但无法正常工作。在 instrumentantiontest 模块 gradle 文件中,我使用了 'compile' 语句,因为源位于 `main' 中。一切都可以编译,但是在运行所有仪器测试时,它找不到任何测试。当专门破坏测试方法时,测试错误并带有 ClassNotFound 异常
  • 我认为这个答案只有在共享的代码确实是多个其他模块中需要的 Utils 时才有帮助。如果基本模块包含一些特定于基本模块中“实际”代码的测试结构/帮助程序,那么在组织上,将这些测试结构保留在基本模块中是有意义的。
  • 这似乎应该可以工作,但我收到“未解决的参考:BaseTest”错误。
【解决方案3】:

Stimsoni 的回答几乎没有变化,这终于对我有用。 我将此添加到我的应用程序 gradle 中:

sourceSets {
    test.java.srcDirs += ["${project(':app-base').projectDir}/src/test/java"]
}

【讨论】:

  • 第一个版本androidTest.java + /src/androidTest 用于仪器测试(androidTest),第二个test.java + /src/test 用于纯单元测试(test)
猜你喜欢
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多