如何在另一个模块的androidTest目录中使用代码

mao*_*lin 19 testing android gradle

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

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

app
|
|----src
      |____androidTest
                |________MyTest.java
Run Code Online (Sandbox Code Playgroud)

一些常见的测试类在app-base的androidTest中定义,并在app'androidTest中使用.

我试图在app的build.gradle中添加以下代码:

    evaluationDependsOn(':app-base')

    compile project(':app-base')

    androidTestCompile project(':app-base')
Run Code Online (Sandbox Code Playgroud)

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

Root project 'MyProject'
+--- Project ':app-base' 
+--- Project ':app'
Run Code Online (Sandbox Code Playgroud)

通过这种方式没有编译错误,但是当我在ide中运行MyTest时,它表示找不到类MyTestBase.

你知道什么是错的吗?任何想法都表示赞赏.谢谢.

Sti*_*oni 24

我一直在寻找解决方案一段时间,终于找到了对我有用的东西。

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

android {
    ...

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

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

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

  • 顺便说一句,它可以工作,但 Android Studio 无法识别其他模块中的文件。唯一烦人的是因为该文件的 import stmt 下面有红色的波浪线。 (2认同)
  • 我决定使用 @ben75 的其他解决方案,因为我担心红色波浪线会让这个解决方案让其他长期维护它的人感到困惑。 (2认同)

ben*_*n75 7

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

test-utils
|
|----src
      |____main
             |________MyTestBase.java
Run Code Online (Sandbox Code Playgroud)

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

androidTestCompile project(':test-utils')
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案只有在共享的代码确实是多个其他模块中需要的 Utils 时才有帮助。如果基本模块包含一些特定于基本模块中“实际”代码的测试结构/帮助程序,那么在组织上,将这些测试结构保留在基本模块中是有意义的。 (2认同)