Robolectric与Gradle:资源未find

我试图与新的Gradle Android构build系统一起运行我的Robolectrictesting,但是我被困在访问我的主项目的资源。

我把构build分成两个单独的项目,以避免javaandroid gradle插件之间的冲突,所以目录结构看起来大致是这样的:

 . ├── build.gradle ├── settings.gradle ├── mainproject │  ├── build │  │  ├── classes │  │  │  └── debug │  ├── build.gradle │  └── src │  └── main │  ├── AndroidManifest.xml │  └── ... └── test ├── build.gradle └── src  └── test  └── java  └── ...  └── test  ├── MainActivityTest.java  ├── Runner.java  ├── ServerTestCase.java  └── StatusFetcherTest.java 

我的build.gradletest/目前看起来像这样:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.stanfy.android:gradle-plugin-java-robolectric:2.0' } } apply plugin: 'java-robolectric' repositories {...} javarob { packageName = 'com.example.mainproject' } test { dependsOn ':mainproject:build' scanForTestClasses = false include "**/*Test.class" // Oh, the humanity! def srcDir = project(':mainproject').android.sourceSets.main.java.srcDirs.toArray()[0].getAbsolutePath() workingDir srcDir.substring(0, srcDir.lastIndexOf('/')) } project(':mainproject').android.sourceSets.main.java.srcDirs.each {dir -> def buildDir = dir.getAbsolutePath().split('/') buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/') sourceSets.test.compileClasspath += files(buildDir) sourceSets.test.runtimeClasspath += files(buildDir) } dependencies { testCompile group: 'com.google.android', name: 'android', version: '4.1.1.4' testCompile group: 'org.robolectric', name: 'robolectric', version: '2.0-alpha-3' ... } 

邪恶的classpath hackery允许我访问我的主要项目的所有类,除了R ,在构build目录中作为.class文件存在,但在compileTestJava任务期间引发了这个错误:

 /.../MainActivityTest.java:16: error: cannot find symbol final String appName = activity.getResources().getString(R.string.app_name); ^ symbol: variable string location: class R 1 error :test:compileTestJava FAILED 

新的编译系统必须有更好的方法来执行Robolectrictesting,对吧?

( 应用程序的完整源代码 )

Solutions Collecting From Web of "Robolectric与Gradle:资源未find"

我遇到了同样的问题,这就是我想到的。 我没有为testing创build单独的项目,而是为Robolectrictesting创build了一个源代码集,并添加了一个“检查”将依赖的新任务。 使用你的问题的一些代码,这里是(工作)构build文件的相关位:

 apply plugin: 'android' sourceSets { testLocal { java.srcDir file('src/test/java') resources.srcDir file('src/test/resources') } } dependencies { compile 'org.roboguice:roboguice:2.0' compile 'com.google.android:support-v4:r6' testLocalCompile 'junit:junit:4.8.2' testLocalCompile 'org.robolectric:robolectric:2.1' testLocalCompile 'com.google.android:android:4.0.1.2' testLocalCompile 'com.google.android:support-v4:r6' testLocalCompile 'org.roboguice:roboguice:2.0' } 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 

我已经包含了我的依赖关系块,指出为了让我得到这个起来,我不得不重复我的自定义testLocal源集中的所有compile依赖项。

运行gradle testLocal构build并运行src/test/java ,同时运行gradle check运行这些testing以及默认android instrumentTest源代码集中的testing。

希望这可以帮助!

更新:杰克·沃顿刚刚宣布了gradle-android-test-plugin 。 你可以在https://github.com/square/gradle-android-test-pluginfind它

这似乎是相当精简,尤其是如果你打算使用robolectric


老答案在下面

robolectric-plugin看起来很有前途。

他们提供的示例build.gradle文件是:

 buildscript { repositories { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencies { classpath 'com.android.tools.build:gradle:0.4.2' classpath 'com.novoda.gradle:robolectric-plugin:0.0.1-SNAPSHOT' } } apply plugin: 'android' apply plugin: 'robolectric' repositories { mavenCentral() mavenLocal() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencies { //compile files('libs/android-support-v4.jar') // had to deploy to sonatype to get AAR to work compile 'com.novoda:actionbarsherlock:4.3.2-SNAPSHOT' robolectricCompile 'org.robolectric:robolectric:2.0' robolectricCompile group: 'junit', name: 'junit', version: '4.+' } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { minSdkVersion 7 targetSdkVersion 17 } } 

它似乎没有与Android Gradle插件版本0.5,但也许会很快。