Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting a custom assets directory for unit testing in Android Studio

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".

  • Various combinations of above, plus androidTest.setRoot("test"), androidTest.setRoot("androidTest"), both of which cause our unit tests to not be recognized ("empty suite").

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.

like image 298
Phillip Fitzsimmons Avatar asked Sep 05 '14 10:09

Phillip Fitzsimmons


People also ask

Which directory is used to store unit tests in your Android project?

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.

Where do I put assets in 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.

What is the use of assets folder in Android?

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.

How do I change assets in Android?

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.


2 Answers

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.

like image 89
Phillip Fitzsimmons Avatar answered Sep 21 '22 14:09

Phillip Fitzsimmons


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.

like image 25
Yair Kukielka Avatar answered Sep 19 '22 14:09

Yair Kukielka