Android test raw resource

19,234

Solution 1

By default your androidTest project will include your app's R class, but androidTest's resources will be generated into a separate file. Make sure you import the R class from your test project:

import com.your.package.test.R;

[..]

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

You can also directly reference the test project's R class:

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

Solution 2

I had the androidTest resources in the right spot (src/androidTest/res) and I still couldn't access them via <normal.package>.test.R. I spent a lot of time googling trying to figure out what was going on..

I FINALLY stumbled onto the answer. If you're building a buildType where you specified an applicationIdSuffix, your files are at <applicationId><applicationIdSuffix>.test.R !!!!

i.e.

applicationId "com.example.my.app"

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}

if you have androidTest resources in the right directory, then you can only access them via com.example.my.app.debug.test.R !!!!

Solution 3

See Android Unit Tests Requiring Context. For instrumentation test use InstrumentationRegistry.getInstrumentation().getTargetContext() (in Kotlin: getInstrumentation().targetContext). Then you can access resources. You won't need to import R file.

Share:
19,234
jlhonora
Author by

jlhonora

Updated on June 23, 2022

Comments

  • jlhonora
    jlhonora about 2 years

    I have the following folder structure in Android Studio:

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

    I'm trying to access the test_file resource which exists in the raw folder of the androidTest elements. Here's the code inside a Robotium test case that inherits from ActivityInstrumentationTestCase2:

    InputStream is = this.getInstrumentation()
                     .getContext()
                     .getResources()
                     .openRawResource(R.raw.test_file);
    

    Android Studio throws a reference error since the resource cannot be found. The exact error is "Cannot resolve symbol test_file".

    How can I reference this resource form a test case, which exists on the androidTest resources bundle?

  • Yaroslav Mytkalyk
    Yaroslav Mytkalyk over 8 years
    I've got the same file stucture as the OP, but raw is not generated for androidTest variant.
  • jlhonora
    jlhonora over 8 years
    @YaroslavMytkalyk what kind of file are you putting in the raw folder?
  • Yaroslav Mytkalyk
    Yaroslav Mytkalyk over 8 years
    @jlhonora a binary file with no extension. Tried renaming it adding some arbitrary extension, which didn't change anything.
  • Victor Paléologue
    Victor Paléologue about 4 years
    By doing so, the resource ends in the published APK too. How to avoid that?
  • yshahak
    yshahak almost 4 years
    Even without applicationIdSuffix you should use < applicationId>.test.R in case applicationId is different than your package name.