Android 测试原始资源

Android test raw resource

我在 Android Studio 中有以下文件夹结构:

├── androidTest
│   ├── java
│   └── res
│       └── raw
│           └── test_file
└── main
    ├── java
    └── res
        └── raw
            └── app_file

我正在尝试访问 androidTest 元素的原始文件夹中存在的 test_file 资源。这是继承自 ActivityInstrumentationTestCase2:

的 Robotium 测试用例中的代码
InputStream is = this.getInstrumentation()
                 .getContext()
                 .getResources()
                 .openRawResource(R.raw.test_file);

Android Studio 抛出引用错误,因为找不到资源。准确的错误是 "Cannot resolve symbol test_file".

如何从 androidTest 资源包中存在的测试用例中引用此资源?

默认情况下,您的 androidTest 项目将包含您应用的 R class,但 androidTest 的资源将生成到一个单独的文件中。确保从测试项目中导入 R class:

import com.your.package.test.R;

[..]

getInstrumentation().getContext().getResources().openRawResource(R.raw.test_file);

也可以直接引用测试项目的R class:

getInstrumentation().getContext().getResources().openRawResource(com.your.package.test.R.raw.test_file);

我在正确的位置 (src/androidTest/res) 拥有 androidTest 资源,但我仍然无法通过 <normal.package>.test.R 访问它们。我花了很多时间谷歌搜索试图弄清楚发生了什么..

我终于找到了答案。如果您在指定 applicationIdSuffix 的地方构建 buildType,您的文件位于 <applicationId><applicationIdSuffix>.test.R !!!!

applicationId "com.example.my.app"

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}

如果您在正确的目录中有 androidTest 资源,那么您只能通过 com.example.my.app.debug.test.R !!!!

访问它们

参见Android Unit Tests Requiring Context。对于仪器测试,使用 InstrumentationRegistry.getInstrumentation().getTargetContext()(在 Kotlin 中:getInstrumentation().targetContext)。然后就可以访问resources了。您不需要导入 R 文件。

正如其他人所说,android测试资源 ID 默认在 <applicationId>.test.R 中生成。由于 applicationId 可以通过不同的构建类型和风格进行修改,这导致它们各自的 R 文件位置不同。这可以通过在 build.gradle 中应用的 android 配置的 defaultConfig 中为 testApplicationId 分配显式值来更改。如果有多个构建 types/flavors 改变了 appId,它会很有用,但测试可以是 运行 任何一个。

build.gradle(应用):

android {
    defaultConfig {
    applicationId "com.example.hello"
    testApplicationId = "com.example.hello.test"
    }
}

测试文件:

import com.example.hello.test.R