web-dev-qa-db-ja.com

Gradleを使用したRobolectric:リソースが見つかりません

Robolectricテストを新しいGradle Androidビルドシステムと一緒に実行しようとしていますが、メインプロジェクトのリソースにアクセスできません。

ビルドを2つの別々のプロジェクトに分割して、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'
    ...
}

悪質なクラスパスハッカーにより、ビルドディレクトリに.classファイルとして存在するRを除いて、メインプロジェクトのすべてのクラスにアクセスできますが、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

新しいビルドシステムでRobolectricテストを実行するより良い方法があるはずですよね?

アプリの完全なソース

31
passy

私はこれと同じ問題に遭遇していましたが、これが私が思いついたものです。テスト用に個別のプロジェクトを作成する代わりに、Robolectricテスト用のソースセットを作成し、「チェック」が依存する新しいタスクを追加しました。あなたの質問からのコードのいくつかを使用して、ここに(動作する)ビルドファイルの関連ビットがあります:

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

これを有効にするには、カスタムcompileソースセットですべてのtestLocal依存関係を繰り返す必要があることを指摘するために、依存関係ブロックを含めました。

gradle testLocalを実行すると、src/test/Java内のテストのみがビルドおよび実行され、gradle checkを実行すると、デフォルトのテストに加えてこれらのテストが実行されますAndroid instrumentTestソースセット。

お役に立てれば!

27
user2457888

更新:Jake Whartonが gradle-Android-test-pluginhttps://github.com/square/gradle-Android-test-plugin で見つけることができます

特に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では動作しないようですが、まもなく動作するでしょう。

8
Saad Farooq