Android 单元测试不会使用正确的应用程序 class

Android unit tests won't use correct Application class

关于 android 在单元测试中如何选择 Application class,我遇到了一些奇怪的行为。

我在目录 src/testDevelopmentDebug

中有 Robolectric 个单元测试

我在 src/testDevelopmentDebugandroidTestDevelopment 之间也有一些测试代码,分别用于单元测试和浓缩咖啡测试。共享代码在 src/sharedTest 中,我在我的 build.gradle 文件中有这样的设置:

sourceSets {
    // Android Studio / the Android Studio Kotlin Plugin will stop recognizing these source folders as source
    // folders without explicitly setting them
    main.java.srcDirs += 'src/main/kotlin'
    testDevelopmentDebug.java.srcDirs += 'src/testDevelopmentDebug/kotlin'
    androidTestDevelopment.java.srcDirs += 'src/androidTestDevelopment/kotlin'

    // Share code between UI and unit tests.
    def sharedTestDir = 'src/sharedTest/kotlin'
    androidTestDevelopment.java.srcDirs += sharedTestDir
    testDevelopmentDebug.java.srcDirs += sharedTestDir
}

我的问题是我试图在两者之间共享 Application class,但它并不完全有效。我在共享测试文件夹中有 SharedTestApplication。但是当我像这样在 testDevelopmentDebug/AndroidManifest.xml 文件中引用它时:

<application android:name="com.books.sharedtest.SharedTestApplication"/>

Espresso 测试使用 SharedTestApplication 就像我期望的那样。

单元测试默认回到我的 src/main Application class 并改用它。现在这是奇怪的部分。如果我在 src/testDevelopmentDebug 中扩展 SharedTestApplication 并且什么都不做。 (甚至不更改清单)然后它使用 SharedTestApplication 就像我想要的那样。

知道为什么吗?

Robolectric 正在加载默认值 AndroidManifest.xml,除非您在 @Config 中指定不同的清单。您也可以在 @Config 中指定应用程序 class。

tutorial 中查看更多信息。