test 和 androidTest 之间共享 srcDirs,升级到 Android Studio Chipmunk 后未解析的引用 (IntelliJ 2021.2.1)

Sea*_*ici 41 android intellij-idea shared-resource android-studio source-sets

我刚刚从 Bumblebee 升级到 Chipmunk,并且在我的检测 androidTests 中遇到了多个依赖项解析问题。

这些是我的源集的样子:

sourceSets {
    test.java.srcDirs += 'src/testShared/kotlin'
    test.resources.srcDirs += 'src/testShared/resources'
    androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
    androidTest.java.srcDirs += 'src/testShared/kotlin'
    androidTest.resources.srcDirs += 'src/testShared/resources'
}
Run Code Online (Sandbox Code Playgroud)

这个想法是在单元测试和仪器测试之间共享测试数据。请记住,测试可以构建并执行,但依赖项在 IDE 中显示为红色。另外,它可能不相关,但我引用的字符串资源(位于资源模块中)在 IDE 中也是红色的。

另外,当我注释掉指向 testShared 的单元测试源集时,IDE 错误会在我的 AndroidTests 中消失

这在以前版本的 Android Studio 中不是问题。我认为该问题与基本 IntelliJ IDE 平台有关。有谁知道如何解决这个问题,或者有任何解决方法?

编辑:这是一个基本示例项目,在 Chipmunk 及以上版本中运行时演示了该问题。在bumblebee中,androidTest中没有未解决的引用错误。另外,您可能需要调整 AGP 版本,因为我使用 Dolphin beta01 构建了这个项目,但 Chipmunk 中的问题是相同的 https://drive.google.com/file/d/1ZCcEwuqM-m4E5qe94vCn52yWMON8rd5P/view?usp=分享

Sea*_*ici 18

新版本的 Android Studio IDE 和 IntelliJ 平台似乎不再支持此功能。

编辑:以这种方式共享代码不再有效。但是,还有另一种方法可以使其发挥作用:

基本上,创建一个 android 库(sharedTestCode),通过 testImplementation 和 androidTestImplementation 在您的应用程序中依赖它。在sharedTestCode build.gradle 文件中,取决于应用程序。您现在应该能够创建共享测试数据并在两种类型的测试中引用它们。

这是一个使用此设置的示例项目:

https://drive.google.com/file/d/1I2CZhTxHGRgCN9UCEjIuWUfFnGxTF_Cv/view?usp=sharing

第二次编辑:确保依赖于 :app 项目的任何模块也定义了productFlavors和flavorDimensions,与应用程序的build.gradle文件的build.gradle配置相匹配。

例如,我必须将此代码添加到我的sharedTestModule的build.gradle文件中:

flavorDimensions "environment"

productFlavors {
    local {
        dimension "environment"
    }
    gae {
        dimension "environment"
    }
}
Run Code Online (Sandbox Code Playgroud)

之前的回复:

我创建了一个支持线程: https://issuetracker.google.com/issues/232420188

以下是 Google 关于这种引用测试数据的旧方法的答案:

IDE 不再支持以这种方式共享代码。之前之所以有效,是因为在 pre-chipmunk 中,我们运行 Android studio 导入,并设置了 intellij 选项,为每个 Gradle 项目创建一个模块。这个选项已经从 IDEA 中删除很多年了。以这种方式导入会带来很多问题,因为 intellij 模块只能设置两个范围的依赖项和其他信息,即编译和测试。默认情况下,Android 模块实际上具有三个不同的作用域(大致对应于每个变体的 Gradle 源集):main、unitTest 和 androidTest。使用此选项将这些映射到 intellij 模块需要我们合并 unitTest 和 androidTest 的依赖项。此外,任何自定义源集也需要合并。这导致编辑器中出现许多错误的符号解析以及许多其他问题。

在chipmunk 中,我们转而为每个(大致)Gradle 源集创建一个模块。这使我们能够正确映射信息,但不幸的是,这确实会导致 IDE 不支持源集之间的信息共享。

总而言之,为了正确,每个源文件必须仅出现在一个模块中,否则 IDE 无法知道要使用哪个上下文。这有时也会导致构建方面的微妙问题。要在测试模块之间共享源代码,您应该能够将代码放入单独的项目中,并将其作为 testImplementation 和 androidTestImplementation 的依赖项使用。

  • 那太疯狂了。我有两个类想要分享,这需要创建一个完整的库??? (4认同)
  • 太棒了...我不知道如何解决主应用程序的类,您通过声明相同的风格提供的帮助对我很有帮助,谢谢 (2认同)

don*_*ner 6

要解决此问题,请将共享的测试依赖项移至单独的模块中。就是这样:

  • 在项目窗口中右键单击并转到“新建”->“模块”
  • 选择“Android库”模板
  • 模块名称shared-test
  • 包名称应该是主应用程序中的名称
  • 点击“完成”

在此输入图像描述

将您的共享代码移至:shared-test模块内。

现在,在应用程序的文件中添加对单元模块和检测测试构建配置的build.gradle依赖项::shared-test

testImplementation(project(":shared-test"))
androidTestImplementation(project(":shared-test"))
Run Code Online (Sandbox Code Playgroud)

如果您的共享测试代码依赖于应用程序中的代码(例如,您有引用应用程序接口的 Hilt 模块),请在build.gradle应用程序模块上的共享测试模块文件中添加依赖项:

compileOnly(project(":app"))
Run Code Online (Sandbox Code Playgroud)

这里使用compileOnlyand很重要,否则你可能会得到s,因为类是在多个 DEX 文件中定义的。 implementationcom.android.builder.dexing.DexArchiveMergerException

GitHub 上的示例: https: //github.com/android/architecture-samples