Unable to get Robotium to work in Android Studio

0
0

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

  • You must to post comments
0
0

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:

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

  2. 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
    }
    }
  3. I added the robotium library in Project Structure (command-; on my mac) as a maven libary.

  4. 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);
    }
    }
  5. I then ran the test via the command line ./gradlew connectedInstrumentTest and it worked for me.

  • You must to post comments
Showing 1 result
Your Answer
Post as a guest by filling out the fields below or if you already have an account.
Name*
E-mail*
Website