我正在尝试使用Robolectric设置测试以单击此存储库中的菜单按钮.基本的Robolectric测试将运行,但我无法使用资源运行任何项目特定的测试,因为它说它无法找到我的AndroidManifest.xml.运行后../gradlew clean check,这是Robolectric html文件的标准输出:
WARNING: No manifest file found at ./AndroidManifest.xml.Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).
我发现这些说明表明我应该创建一个org.robolectric.Config.properties文件,但我不知道该把它放到哪里.我几乎到处都试过,尽管移动了文件,但错误信息中的路径始终与上面相同(./AndroidManifest.xml).这让我觉得构建过程从未获取文件中的设置org.robolectric.Config.properties.
我也尝试了@Config(manifest ="")指令,但这给了我一个cannot find symbol错误.如果我将AndroidManifest.xml移动到我的项目目录中,那么我得到一个错误,它无法找到路径./res/values,我也无法解决.有任何想法吗?
更新1
谢谢欧根,我现在用@RunWith(RobolectricGradleTestRunner.class)而不是@RunWith(RobolectricTestRunner).
现在我得到了一个不同的错误,仍然发生在我的BasicTest.java的同一行
KeywordList keywordList = Robolectric.buildActivity(KeywordList.class).create().get();
Run Code Online (Sandbox Code Playgroud)
以下是Robolectric测试报告中标准错误,标准输出和"失败测试"选项卡的结果:
注意:我也尝试用最新的Robolectric更新,robolectric-2.2-SNAPSHOT.jar构建的jar替换,但仍然出错.
标准错误
WARNING: no system properties value for ro.build.date.utc
标准输出
DEBUG: Loading resources for net.frontlinesms.android from ~/workspace-studio/frontlinesms-for-android/FrontlineSMS/build/res/all/debug...
DEBUG: Loading …Run Code Online (Sandbox Code Playgroud) 我从https://github.com/robolectric/deckard-gradle下载了Robolectric deckard-gradle项目并导入到Android Studio.
在我第一次跑步时,我得到了
!!! JUnit version 3.8 or later expected:
java.lang.RuntimeException: Stub!
at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
at junit.textui.TestRunner.<init>(TestRunner.java:54)
at junit.textui.TestRunner.<init>(TestRunner.java:48)
at junit.textui.TestRunner.<init>(TestRunner.java:41)
Run Code Online (Sandbox Code Playgroud)
错误,我从.iml修复此问题.
然后我得到了:
Class Not Found "my test class"
Run Code Online (Sandbox Code Playgroud)
我尝试了几十种解决方案,我在谷歌中发现了这个问题,但没有一个有效.
我正在尝试在Android Studio中使用Robolectric进行单元测试.我快到了 - 我明白了:
!!! JUnit version 3.8 or later expected:
java.lang.RuntimeException: Stub!
at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
at junit.textui.TestRunner.<init>(TestRunner.java:54)
at junit.textui.TestRunner.<init>(TestRunner.java:48)
at junit.textui.TestRunner.<init>(TestRunner.java:41)
at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:185)
...
Run Code Online (Sandbox Code Playgroud)
我也看到了类路径中所有必需的依赖项.要修复此错误,我需要在android sdk依赖项之前放置junit4依赖项.不幸的是我没有在Project Structure部分看到模块,我不知道如何编辑iml文件来存档它.
这是我的项目结构的截图:

我的gradle文件:
sourceSets {
testLocal {
java.srcDir file('src/test/java')
resources.srcDir file('src/test/resources')
}
}
dependencies {
// compatibility
compile 'android.compatibility:android-support:v4-r13'
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
testLocalCompile 'junit:junit:4.11'
testLocalCompile 'org.robolectric:robolectric:2.2'
testLocalCompile 'org.easytesting:fest-assert-core:2.0M10'
}
android {
buildToolsVersion "17"
compileSdkVersion 18
productFlavors {
testLocal{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我选择了AS中的testLocal风味.
我正在使用robolectric gradle插件为Android编写单元测试.除了能够使用Android Studio正确调试我的测试之外,到目前为止一切正常.
我做了一些调查(http://forums.gradle.org/gradle/topics/how_do_you_attach_a_debugger_to_gradle_so_that_i_can_debug_it_running_a_task),我最终得到的结果是:
从控制台启动可调试的gradle配置
gradlew -DtestDebug.debug=true app:clean app:testDebug
这将停止gradle构建并在5005等待监听器
在Android Studio中创建"远程"启动配置,该配置将附加在端口5005上
在Debug-mode中从Android Studio启动该配置
每次都要完成步骤1 + 3,我想调试我的测试.这很烦人.我想有办法,我可以直接从intelliJ启动gradle构建,它会自动附加调试器.我怎样才能做到这一点?
信息:(当然,理想的解决方案是我可以通过IntelliJ的JUnit配置直接启动单元测试,因为这样可以给我IDE支持,整齐地显示失败和通过测试等等.但是我遇到了问题. JUnit构建时没有找到Manifest文件等,所以我暂时放弃了它.)
**Gradle构建文件**
apply plugin: 'com.android.application'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.robolectric:robolectric-gradle-plugin:0.12.+'
}
}
apply plugin: 'robolectric'
android {
compileSdkVersion 20
buildToolsVersion "20.0.0"
packagingOptions {
exclude 'LICENSE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE'
}
defaultConfig {
applicationId "test.fs.test"
minSdkVersion 14
targetSdkVersion 20
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false …Run Code Online (Sandbox Code Playgroud) debugging android intellij-idea gradle android-gradle-plugin
我最近将我的系统从Mavericks(OSX)更新为Yosemite.我用来能够右键单击测试并运行它.现在我得到了例外
/Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home/bin/java -ea -Didea.launcher.port=7541 "-Didea.launcher.bin.path=/Applications/Android Studio.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Applications/Android Studio.app/Contents/lib/idea_rt.jar:/Applications/Android Studio.app/Contents/plugins/junit/lib/junit-rt.jar:/Users/michael.cameron/Code/Android/sdk/platforms/android-21/android.jar:/Users/michael.cameron/Code/Android/sdk/platforms/android-21/data/res:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/build/intermediates/classes/debug:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/21.0.3/classes.jar:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/21.0.3/res:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/libs/ParseCrashReporting-1.8.0.jar:/Users/michael.cameron/Code/Android/sdk/extras/android/m2repository/com/android/support/support-annotations/21.0.3/support-annotations-21.0.3.jar:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/build/intermediates/exploded-aar/com.android.support/support-v4/21.0.3/res:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/build/intermediates/exploded-aar/com.android.support/support-v4/21.0.3/classes.jar:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/build/intermediates/exploded-aar/com.android.support/support-v4/21.0.3/libs/internal_impl-21.0.3.jar:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/libs/Parse-1.8.0.jar:/Users/michael.cameron/.gradle/caches/modules-2/files-2.1/com.parse.bolts/bolts-android/1.1.4/129874135e6081269ace2312092031558865de12/bolts-android-1.1.4.jar:/Users/michael.cameron/Code/Android/darxstudios/TheChefsCodex/app/libs/bolts-android-1.1.4.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 com.darxstudios.thechefscodex.ApplicationTest
Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:116)
Caused by: java.lang.ClassNotFoundException: junit.textui.ResultPrinter
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 3 more
Run Code Online (Sandbox Code Playgroud)
它也可能与我在我的Dock中点击打开的Android Studio图标时有关,我得到错误没有找到JVM,但我可以通过终端打开它没问题.
这与一个全新的android studio项目相同,默认的applicationTest试图运行.
android ×5
gradle ×3
robolectric ×2
debugging ×1
dependencies ×1
java ×1
junit ×1
tdd ×1
testing ×1
unit-testing ×1