Robolectricテストを新しいGradle Androidビルドシステムと一緒に実行しようとしていますが、メインプロジェクトのリソースにアクセスできません。
ビルドを2つの別々のプロジェクトに分割して、Java
とAndroid
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.gradle
のtest/
は現在次のようになっています。
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テストを実行するより良い方法があるはずですよね?
( アプリの完全なソース )
私はこれと同じ問題に遭遇していましたが、これが私が思いついたものです。テスト用に個別のプロジェクトを作成する代わりに、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ソースセット。
お役に立てれば!
更新:Jake Whartonが gradle-Android-test-plugin
。 https://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では動作しないようですが、まもなく動作するでしょう。