Android多模块测试依赖

kot*_*oMJ 13 unit-testing android-studio build.gradle android-gradle-plugin gradle-plugin

使用Android Studio 3.0/android_gradle_version ='3.0.1'/ gradle-4.5

假设我有两个android模块

module-base
module-a
Run Code Online (Sandbox Code Playgroud)

当我想从module-a中的module-base访问源代码时,我只需要在我的module-a.gradle中编写它

dependencies {
implementation project(path: ':module-base')
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想在模块-a的测试中从模块库访问测试源呢? 这里没有像上面那样工作的方法

dependencies {
testImplementation project(path: ':module-base')
}
Run Code Online (Sandbox Code Playgroud)

我找到了很多建议(几年前)

    compileTestJava.dependsOn tasks.getByPath(':module-base:testClasses')
    testCompile files(project(':module-base').sourceSets.test.output.classesDir)
Run Code Online (Sandbox Code Playgroud)

要么 testCompile project(':module-base).sourceSets.test.classes

但没有人提到过.从编译器的角度来看总是有问题: - /

你能帮助我如何在两个模块之间创建Android测试代码依赖吗?

wil*_*xyz 11

如果其他人最终到达这里,实现此目的的一种方法是将目标模块定义为源集。假设test-mdoule是我们要从中导入内容的模块,我们可以这样做:

android {
    sourceSets {
        // non-instrumental test example
        test {
            java.srcDir project(":test-module").file("src/test/java")
        }
        // instrumental test example
        androidTest {
            java.srcDir project(":test-module").file("src/androidTest/java")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

参考: https: //jonnycaley.medium.com/sharing-test-code-in-a-multi-module-android-project-7ce4de788016

  • 该解决方案与 Gradle 配合良好,但 Android Studio Electric Eel 仍将共享代码标记为未解析的引用。 (2认同)

kot*_*oMJ 8

实际上,我找到了解决方法。不要使用来自module-base 的测试源,而是使用来自测试相关模块module-testutils 的源,其定义如下

dependencies{
   testImplementation project(':module-testutils')
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以共享通用测试代码,这些代码将被排除在不可测试的 apk 之外。