整理androidTest和test之间的共享代码

Organize shared code between androidTest and test

我正在以 gradle 项目的形式构建一个 android 组件。为了使用 espresso 框架在多个配置中测试我的组件 UI,我在 androidTest 源集中有一个 TestActivity,我可以检测它。

阐明文件树:

src/
    androidTest/
        java/my.package/
            TestActivity.kt
            ...
        res/layout/
            my_test_activitity.xml
    test/
        java/my.package/
            MyUnitTests.kt

现在我想开始使用 robolectric 进行一些单元测试,并从那里测试我的 TestActivity。 有趣的是,当我在 MyUnitTests.kt 中设置 Robolectric 时,Android Studio 没有抱怨:

val activity = Robolectric.setupActivity(TestActivity::class.java) // no error

但是,当我尝试 运行 单元测试时,gradle 向我显示此错误:

e: src/test/java/my.package/MyUnitTests.kt: Unresolved reference: TestActivity

我的猜测是 test 源集无法访问 androidTest 源集,尽管 Android Studio 似乎认为它可以访问。

我该如何解决这个问题(使 类 和 androidTest 中的资源可从 test 访问)?在仪器测试和单元测试之间共享代码时,这甚至是正确的方法还是有更好的方法?

我经常通过创建一个 src/commonTest/java 源集来解决这个问题,并通过将以下内容添加到我的 gradle 文件来将其暴露给仪器测试和单元测试:

  android {
    sourceSets {
        String sharedTestDir = 'src/commonTest/java'
        test {
            java.srcDir sharedTestDir
        }
        androidTest {
            java.srcDir sharedTestDir
        }
    }
}

公认的解决方案非常适合普通 Gradle 脚本。然而,对于任何使用 Gradle Kotlin DSL(*.kts 文件)的人来说,这应该可以解决问题。

sourceSets {
    val sharedTestDir = "src/sharedTest/java"
    getByName("test") {
        java.srcDir(sharedTestDir)
    }
    getByName("androidTest") {
        java.srcDirs(sharedTestDir)
    }
}