Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Integrating roboelectric with android studio with gradle always gives package org.junit does not exist error

I am trying to integrate roboelectric in my new project. I used following links to understand and impliment roboelectric

http://pivotallabs.com/setting-up-robolectric-in-android-studio-1-1-on-os-x/

http://nenick-android.blogspot.in/2015/02/android-studio-110-beta-4-and.html

http://raptordigital.blogspot.in/2014/02/test-driven-development-with.html

But I am gettin following error on running my test class

Error:Gradle: Execution failed for task ':app:compileDebugJava'.
> Compilation failed; see the compiler error output for details.
E:\junitTest\android-studio-robolectric-example-master\JunitTestApp\app\src\test\java\com\inapp\junittestapp\SampleTest.java
Error:(7, 17) Gradle: error: package org.junit does not exist
 Error:(8, 24) Gradle: error: package org.junit.runner does not exist
Error:(9, 23) Gradle: error: package org.robolectric does not exist
 Error:(10, 34) Gradle: error: package org.robolectric.annotation does not exist
Error:(11, 31) Gradle: error: package org.robolectric.shadows does not exist
Error:(13, 27) Gradle: error: package org.hamcrest does not exist
Error:(13, 1) Gradle: error: static import only from classes and interfaces
Error:(14, 27) Gradle: error: package org.hamcrest does not exist
Error:(14, 1) Gradle: error: static import only from classes and interfaces
Error:(15, 24) Gradle: error: package org.junit does not exist
Error:(15, 1) Gradle: error: static import only from classes and interfaces
Error:(16, 30) Gradle: error: package org.robolectric does not exist
Error:(16, 1) Gradle: error: static import only from classes and interfaces
Error:(17, 30) Gradle: error: package org.robolectric does not exist
Error:(17, 1) Gradle: error: static import only from classes and interfaces
Error:(18, 30) Gradle: error: package org.robolectric does not exist
Error:(18, 1) Gradle: error: static import only from classes and interfaces
Error:(25, 2) Gradle: error: cannot find symbol class RunWith
Error:(26, 2) Gradle: error: cannot find symbol class Config
Error:(30, 6) Gradle: error: cannot find symbol class Test
Error:(32, 38) Gradle: error: cannot find symbol method      setupActivity(Class<MainActivity>)
Error:(36, 9) Gradle: error: cannot find symbol method clickOn(Button)
Error:(38, 41) Gradle: error: cannot find symbol variable ShadowAlertDialog
Error:(39, 42) Gradle: error: cannot find symbol method notNullValue()
Error:(41, 9) Gradle: error: cannot find symbol class ShadowAlertDialog
Error:(41, 47) Gradle: error: cannot find symbol method shadowOf(AlertDialog)
Error:(42, 61) Gradle: error: cannot find symbol method is(String)

Added below my test class code

import android.app.AlertDialog;
import android.widget.Button;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowAlertDialog;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.robolectric.Robolectric.clickOn;
import static org.robolectric.Robolectric.setupActivity;
import static org.robolectric.RobolectricBase.shadowOf;


@RunWith(RobolectricTestRunner.class)
@Config(manifest = "app/src/main/AndroidManifest.xml", emulateSdk = 18)
public class SampleTest {

    @Test
    public void buttonTapDisplaysAnAlertDialog() {
        MainActivity helloActivity = setupActivity(MainActivity.class);

        Button button = (Button) helloActivity.findViewById(R.id.button);

        clickOn(button);

        AlertDialog latestAlertDialog = ShadowAlertDialog.getLatestAlertDialog();
        assertThat(latestAlertDialog, is(notNullValue()));

        ShadowAlertDialog shadowAlertDialog = shadowOf(latestAlertDialog);
        assertThat(shadowAlertDialog.getTitle().toString(), is("Hi"));
    }

}

and my app gradle file is

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.junittestapp"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets { main { java.srcDirs = ['src/main/java', 'src/test/java/'] } }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:support-v4:22.1.1'
    testCompile 'junit:junit:4.12'
    testCompile 'org.robolectric:robolectric:2.4'
}

I found same error in this blog too

https://discuss.gradle.org/t/why-cant-my-simplest-one-line-build-gradle-compile-tests-with-junit-jar/1868

I think that I miss something. Any help will be appreciated.

like image 588
Arun Antoney Avatar asked May 26 '15 11:05

Arun Antoney


4 Answers

Your problem is that you have one sourceSet declared as main that contains code for application and for test. That's why Gradle task ':app:compileDebugJava' fails because it doesn't have junit.jar at that moment (it's injected at testCompile - time). Declare two different sourceSet's and everything should work.

sourceSets {
    main {
        java.srcDirs = ['src/main/java']
    }
    robolectric {
        java.srcDir file('src/test/java/')
        resources.srcDir file('src/test/resources')
    }
}
like image 104
falvick Avatar answered Nov 10 '22 18:11

falvick


Same error here. The solution to my case is: remove 'src/test/java' from main.java.srcDirs.

Before:

main.java.srcDirs = ['src/main/java', 'src/test/java']

After:

main.java.srcDirs = ['src/main/java']

Tested OK with Android Studio 2.0 Preview 4. And actually with the latest Android Studio, it's not really necessary to set robolectric property inside sourceSets (as @falvick mentioned).

like image 34
Jing Li Avatar answered Nov 10 '22 17:11

Jing Li


If you got here by trying to run your unit tests in Android you can fix this issue by separately specifying the location of your test files in the sourceSets like so:

sourceSets {
    main { java.srcDirs = ['src/main/java'] }
    test { java.srcDirs = ['src/test/java'] }
}

You can modify to use wherever your source directory is at. Note this goes in the build.gradle (app level)

like image 43
Emmanuel John Avatar answered Nov 10 '22 18:11

Emmanuel John


Had the same problem, in my case I placed the test class in the wrong directory.

src\androidTest\java[package]\

rather than

src\test\java[package]\

I guess you can configure it to work with other directories, but putting unit tests in test and UI/system tests in androidTest looks ok

like image 27
Marcello Avatar answered Nov 10 '22 19:11

Marcello