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

白昼怎懂夜的黑 提交于 2020-01-02 03:37:04

问题


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.


回答1:


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')
    }
}



回答2:


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




回答3:


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)




回答4:


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



来源:https://stackoverflow.com/questions/30457363/integrating-roboelectric-with-android-studio-with-gradle-always-gives-package-or

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!