将 roboelectric 与 android studio 与 gradle 集成总是会出现包 org.junit 不存在的错误
Integrating roboelectric with android studio with gradle always gives package org.junit does not exist error
我正在尝试将 roboelectric 集成到我的新项目中。我使用以下链接来理解和实现 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
但是我在 运行 我的测试 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)
在我的测试下方添加class代码
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"));
}
}
我的应用 gradle 文件是
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'
}
我在这个博客中也发现了同样的错误
我想我错过了什么。任何帮助将不胜感激。
您的问题是您有一个 sourceSet 声明为 main,其中包含应用程序和测试代码。这就是 Gradle 任务 ':app:compileDebugJava' 失败的原因,因为它当时没有 junit.jar(它在 testCompile 时间注入)。声明两个不同的 sourceSet,一切都应该有效。
sourceSets {
main {
java.srcDirs = ['src/main/java']
}
robolectric {
java.srcDir file('src/test/java/')
resources.srcDir file('src/test/resources')
}
}
有同样的问题,就我而言,我将测试 class 放在了错误的目录中。
src\androidTest\java[包]\
而不是
src\test\java[包]\
我想你可以将它配置为与其他目录一起工作,但是将单元测试放在 test 中,将 UI/system 测试放在 androidTest 中看起来不错
如果您是通过尝试 运行 在 Android 中进行单元测试到达此处的,则可以通过在 sourceSet 中单独指定测试文件的位置来解决此问题,如下所示:
sourceSets {
main { java.srcDirs = ['src/main/java'] }
test { java.srcDirs = ['src/test/java'] }
}
您可以修改以在您的源目录所在的任何地方使用。
请注意,这在 build.gradle(应用级别)
同样的错误。我的情况的解决方案是:从 main.java.srcDirs
.
中删除 'src/test/java'
之前:
main.java.srcDirs = ['src/main/java', 'src/test/java']
之后:
main.java.srcDirs = ['src/main/java']
使用 Android Studio 2.0 Preview 4 测试正常。实际上,使用最新的 Android Studio,在 sourceSets 中设置 robolectric 属性 并不是真正必要的(因为@falvick 提到了)。
我正在尝试将 roboelectric 集成到我的新项目中。我使用以下链接来理解和实现 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
但是我在 运行 我的测试 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)
在我的测试下方添加class代码
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"));
}
}
我的应用 gradle 文件是
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'
}
我在这个博客中也发现了同样的错误
我想我错过了什么。任何帮助将不胜感激。
您的问题是您有一个 sourceSet 声明为 main,其中包含应用程序和测试代码。这就是 Gradle 任务 ':app:compileDebugJava' 失败的原因,因为它当时没有 junit.jar(它在 testCompile 时间注入)。声明两个不同的 sourceSet,一切都应该有效。
sourceSets {
main {
java.srcDirs = ['src/main/java']
}
robolectric {
java.srcDir file('src/test/java/')
resources.srcDir file('src/test/resources')
}
}
有同样的问题,就我而言,我将测试 class 放在了错误的目录中。
src\androidTest\java[包]\
而不是
src\test\java[包]\
我想你可以将它配置为与其他目录一起工作,但是将单元测试放在 test 中,将 UI/system 测试放在 androidTest 中看起来不错
如果您是通过尝试 运行 在 Android 中进行单元测试到达此处的,则可以通过在 sourceSet 中单独指定测试文件的位置来解决此问题,如下所示:
sourceSets {
main { java.srcDirs = ['src/main/java'] }
test { java.srcDirs = ['src/test/java'] }
}
您可以修改以在您的源目录所在的任何地方使用。 请注意,这在 build.gradle(应用级别)
同样的错误。我的情况的解决方案是:从 main.java.srcDirs
.
'src/test/java'
之前:
main.java.srcDirs = ['src/main/java', 'src/test/java']
之后:
main.java.srcDirs = ['src/main/java']
使用 Android Studio 2.0 Preview 4 测试正常。实际上,使用最新的 Android Studio,在 sourceSets 中设置 robolectric 属性 并不是真正必要的(因为@falvick 提到了)。