Android Studio unit testing: read data (input) file
In my case, the solution was to add to the gradle file
sourceSets {
test.resources.srcDirs += 'src/unitTests/resources'
}
After it everything was found by AS 2.3.1
javaClass.classLoader.getResourceAsStream("countries.txt")
For local unit tests (vs. instrumentation tests), you can put files under src/test/resources
and read them using classLoader. For example, following code opens myFile.txt
file in the resources directory.
InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");
It worked with
- Android Studio 1.5.1
- gradle plugin 1.3.1
Depending on android-gradle-plugin
version:
1. version 1.5 and higher:
Just put json file to src/test/resources/test.json
and reference it as
classLoader.getResource("test.json").
No gradle modification is needed.
2. version below 1.5: (or if for some reason above solution doesn't work)
Ensure you're using at least Android Gradle Plugin version 1.1. Follow the link to set up Android Studio correctly.
Create
test
directory. Put unit test classes injava
directory and put your resources file inres
directory. Android Studio should mark them like follow:Create
gradle
task to copy resources into classes directory to make them visible forclassloader
:android{ ... } task copyResDirectoryToClasses(type: Copy){ from "${projectDir}/src/test/res" into "${buildDir}/intermediates/classes/test/debug/res" } assembleDebug.dependsOn(copyResDirectoryToClasses)
Now you can use this method to get
File
reference for the file resource:private static File getFileFromPath(Object obj, String fileName) { ClassLoader classLoader = obj.getClass().getClassLoader(); URL resource = classLoader.getResource(fileName); return new File(resource.getPath()); } @Test public void fileObjectShouldNotBeNull() throws Exception { File file = getFileFromPath(this, "res/test.json"); assertThat(file, notNullValue()); }
- Run unit test by Ctrl+Shift+F10 on whole class or specyfic test method.
I though I should add my findings here. I know this is a little old but for the newer versions of Gradle, where there is NO src/test/resources directory, but only one single resources directory for the whole project, you have to add this line to your Gradle file.
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
By doing this you can access your resource with:
this.getClass().getClassLoader().getResourceAsStream(fileName);
I've been searching for this and could not find an answer, so I decided to help others here.