I'm new to testing world and even more to Android testing world. While doing research on Robolectric that aids with tests on android one thing confuses me the most. Sometimes on the web I see people using testCompile
keyword in dependencies of the gradle build script when referencing Robolectric while others use androidTestCompile
. Certainly both can't be valid?
Can somebody explain the difference between the both and which of these should be the one used when using Robolectric?
To answer your question - Use testCompile for robolectric
why, because robolectric runs on the JVM mocking all the android device behaviour.
testCompile and androidTestCompile are "by convention" android folders which gradle uses while running tasks provided by android plugin.
androidTestDebug picks tests from androidTest folder, testDebug picks tests from test folder,
Again these are only by convention folders you can give source sets for these configurations
Note: espresso is such an awesome library try to move away from robolectric :)
Simply
testCompile
is the configuration for unit tests (those located in src/test) andandroidTestCompile
is used for the test api (that located in src/androidTest). Since you are intending to write unit tests, you should usetestCompile
.Update: The main distinction between the two is the
test
sourceset runs in a regular Java JVM, whereas theandroidTest
sourceset tests run on an Android device (or an emulator).To add Dependency for JVM testing or Unit testing (testing those rely only on java environment, we don’t need any android environment).
We Use testCompile directive. Example:
To add Dependency for Instrumentation test (Those testing mainly rely on Android environment), we use the
androidTestCompile
directive.//unit testing
The above code is a dependency of JUnit 4 in build.gradle file in android studio. You see that it has testCompile, beacuse JUnit runs on JVM and does not require a device or emulator to run. That also means that JUnit tests will not require the application context to run and if they require we would need to "MOCK" them.
//Insturmented Unit Testing
Now we see androidTestCompile here, because this time we intend to use the device or emulator for tests, that is Instrumentation testing. For beter clarification I would suggest to read from developer.android.com