I'm struggling to get Robotium to work on the gradle-based Android Studio and I can't find the way to do it
This is my build.gradle file
buildscript {
dependencies {
repositories {
mavenCentral()
mavenLocal()
}
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
/* maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}*/
}
sourceSets {
testLocal {
java.srcDir file('src/test/java')
resources.srcDir file('src/test/resources')
}
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 15
targetSdkVersion 17
}
sourceSets {
instrumentTest.setRoot('src/test')
}
}
dependencies {
compile 'com.android.support:support-v4:13.0.+'
// Dependencies for the `testLocal` task, make sure to list all your global dependencies here as well
testLocalCompile 'junit:junit:4.11'
testLocalCompile 'com.google.android:android:4.1.1.4'
testLocalCompile 'com.android.support:support-v4:13.0.+'
testLocalCompile 'org.robolectric:robolectric:2.1.+'
testLocalCompile 'com.jayway.android.robotium:robotium-solo:4.2'
// Android Studio doesn't recognize the `testLocal` task, so we define the same dependencies as above for instrumentTest
// which is Android Studio's test task
instrumentTestCompile 'junit:junit:4.11'
instrumentTestCompile 'com.google.android:android:4.1.1.4'
instrumentTestCompile 'com.android.support:support-v4:13.0.+'
instrumentTestCompile 'org.robolectric:robolectric:2.1.+'
instrumentTestCompile 'com.jayway.android.robotium:robotium-solo:4.2'
}
task localTest(type: Test, dependsOn: assemble) {
testClassesDir = sourceSets.testLocal.output.classesDir
android.sourceSets.main.java.srcDirs.each { dir ->
def buildDir = dir.getAbsolutePath().split('/')
buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')
sourceSets.testLocal.compileClasspath += files(buildDir)
sourceSets.testLocal.runtimeClasspath += files(buildDir)
}
classpath = sourceSets.testLocal.runtimeClasspath
}
check.dependsOn localTest
As you can see, I'm using Robolectric and Robotium The problem I've got is whenever I try to create a Robotium test, like this one:
import android.test.ActivityInstrumentationTestCase2;
import com.dlv.testing.MainActivity;
import com.jayway.android.robotium.solo.Solo;
public class MainActivityUITest extends
ActivityInstrumentationTestCase2<MainActivity> {
private Solo solo;
public MainActivityUITest() {
super(MainActivity.class);
}
public void setUp() throws Exception {
solo = new Solo(getInstrumentation(), getActivity());
}
public void testStuff() throws Exception {
solo.assertCurrentActivity("Check on first Activity", MainActivity.class);
solo.sendKey(Solo.MENU);
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
}
it cannot find any import, the project does not fail to compile in Android Studio, it just fails when I run the tests and if I remove the class and the references in the dependences, Robolectric works just fine
As far as I can tell, you can't successfully run any tests from Android Studio yet (see How can I create tests in Android Studio?). You need to do it from the command line (note that you may need to clean first ./gradlew clean
):
To run the instrumentTests, use ./gradlew connectedInstrumentTest
To run your test task, use ./gradlew localTest
For future reference when Android Studio works better with test integration, you can set it up to run any given Gradle task. Go to 'Edit Configurations' and click the '+' button to add a new one. Choose 'Gradle' and then configure it to point to the correct gradle.build file and the task you want to run. I'm not sure what you would add in the 'Before launch' section, however, if anything.
All that being said, here's how I got my robotium tests to run:
I used the built-in Instrument Test configuration because I couldn't get the localTest task to work (I got the same errors as you did where it couldn't find any imports). I used the default folder structure with the instrumentTest
folder, but it looks like you can just use the line instrumentTest.setRoot('src/test')
to make it work the same with your setup.
I configured my build.gradle file like this:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
dependencies {
// Included library modules
...
// My regular dependencies
compile 'com.android.support:support-v4:13.0.0'
...
// Test dependencies. Notice that all I have to include is robotium
// because the rest just works using the instrumentTest configuration
instrumentTestCompile 'com.jayway.android.robotium:robotium-solo:4.3'
}
android {
compileSdkVersion 17
buildToolsVersion "18.0.1"
defaultConfig {
minSdkVersion 7
targetSdkVersion 16
}
}
I added the robotium library in Project Structure (command-;
on my mac) as a maven libary.
I then wrote a test like this:
import android.test.ActivityInstrumentationTestCase2;
import com.example.activity.WelcomeScreen;
import com.jayway.android.robotium.solo.Solo;
public class WelcomeScreenTest extends ActivityInstrumentationTestCase2<WelcomeScreen> {
private Solo solo;
public WelcomeScreenTest() {
super(WelcomeScreen.class);
}
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
public void testActivity() {
// robotium assert
solo.assertCurrentActivity("Welcome Screen", WelcomeScreen.class);
// junit assert
assertEquals(true, true);
}
}
I then ran the test via the command line ./gradlew connectedInstrumentTest
and it worked for me.