We have the not uncommon requirement of executing unit tests of our Android application which make use of assets which are only required for unit testing.
With the Eclipse-based SDK this was simple and obvious - the test project was a separate project with its own assets folder. With Android Studio this is meant to be something that one configures in build.gradle (or by convention).
Our unit tests are executing, finally, but I've exhausted every suggestion I've found find regarding a custom (and, ideally, merged) assets folder. Here's what I've tried:
Adding a test closure to sourceSets within the android closure (by closure I mean that which is between the curly braces in build.gradle).
androidTest { assets.srcDirs = ['src/androidTest/assets/'] }
Same thing, but with "test" as the name of the sourceSet (as opposed to "androidTest", above) and also with "instrumentTest".
This question could be more generically stated as "how does one employ different directories for unit tests in Android Studio".
We've been over the documentation from Android and either we're not understanding it, it's wrong, or there's a bug somewhere.
Any help would be very much appreciated.
By default, the source files for local unit tests are placed in module-name/src/test/ . This directory already exists when you create a new project using Android Studio.
Step 1: To create an asset folder in Android studio open your project in Android mode first as shown in the below image. Step 2: Go to the app > right-click > New > Folder > Asset Folder and create the asset folder. Step 3: Android Studio will open a dialog box. Keep all the settings default.
Assets provide a way to include arbitrary files like text, xml, fonts, music, and video in your application. If you try to include these files as "resources", Android will process them into its resource system and you will not be able to get the raw data.
Select app/main folder, Right click and select New => Folder => Asset Folder. It will create 'assets' directory in main. Select main folder, Right click and select New => Directory Enter name as 'assets' = > Ok.
I've stumbled upon an answer for my own question, for which I scored the coveted "Tumbleweed" award reserved for questions that inspire a particularly notable lack of interest. Never-the-less it may prove useful to someone.
In the end I'm going to describe this as a bug in Android's gradle build but in the absence of any conclusive documentation that's going to have to remain an opinion.
It would appear that "androidTest/assets" just doesn't work. However "debug/assets" does. So does "debug/java" incidentally so the solution is to put any and all testing resources and code into the debug root, with the exception of the unit tests themselves.
I also added the following modifications to my build.gradle:
androidTest { assets.srcDirs = ['src/main/assets', 'src/androidTest/assets/', 'src/debug/assets/'] java.srcDirs = ['src/main/java', 'src/androidTest/java', 'src/debug/java'] }
And now I have functioning unit tests employing assets and mocks that are unknown to the release build.
I don't know how it was before, but I was able to create Android instrumented unit tests where I can read test assets or production assets. See this answer for more info.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With