Eclipseからインポートする前のフォルダ構成
root/
a_project/
b_project/
c_project/
...
a_project/
AndroidManifest.xml
assets/
libs/
project.properties
res/
src/
b_project, c_project ... も同様の構成とする
Eclipseにてbuild.gradle生成
build.gradle
buildscript {
repositories { mavenCentral() }
dependencies { classpath 'com.android.tools.build:gradle:1.+' }
}
allprojects { repositories { jcenter() } }
a_project/build.gradle
apply plugin: 'android'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':b_project')
compile project(':c_project')
...
}
android {
compileSdkVersion 18
buildToolsVersion "21.1.2"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
lintOptions { abortOnError false }
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'LICENSE.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
b_project/build.gradle, c_project/build.gradleも同様。ただし、dependenciesのcompile projectは必要な参照プロジェクトに書き換える。
この時点で
gradle build
が通ることを確認する。
単体テストを追加する
a_projectに追加するものとして
a_project/tests/java/com/example/SampleTest.java
package com.example;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class SampleTest {
@Before public void setup() { // setup }
@After public void teardown() { // teardown }
@Test public void sampleFunctionTest() { Assert.fail(); }
}
と単体テストを記述し、以下のbuild.gradleファイルを書き換える。
build.gradle
buildscript {
repositories { mavenCentral() }
dependencies {
classpath 'com.android.tools.build:gradle:1.+'
classpath 'org.robolectric:robolectric-gradle-plugin:0.+' // <- robolectric-gradle-pluginを追加する
}
}
allprojects { repositories { jcenter() } }
a_project/build.gradle
apply plugin: 'android'
apply plugin: 'robolectric' // <- robolectricのプラグインを追加する
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':b_project')
compile project(':c_project')
...
androidTestCompile('junit:junit:4.+') // <- junitへの参照を追加
androidTestCompile('org.robolectric:robolectric:2.+') // <- robolectricへの参照を追加
}
android {
compileSdkVersion 19
buildToolsVersion "21.1.2"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
androidTest.setRoot('tests') // <- testsフォルダをandroidTestのルートフォルダに指定する(デフォルトではsrc/testが設定されているので変更した)
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
lintOptions { abortOnError false }
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'LICENSE.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
この時点で
gradle test
を実行すると先ほど記述した1件のテストが実行され、必ずfailするように書いたので、失敗した趣旨が表示されることを確認する。Assert.fail()をコメントアウトするなりすれば、1件のテストが通るようになる。
Robolectricを使用した単体テストを追加する
a_projectに追加するものとして
a_project/tests/java/com/example/SampleActivityTest.java
package com.example;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
@Config(emulateSdk = 18)
public class SampleTest {
@Before public void setup() { // setup }
@After public void teardown() { // teardown }
@Test public void sampleFunctionTest() {
Activity activity = Robolectric.buildActivity(SampleActivity.class).create().get();
assertFalse(activity.hasDone());
activity.doSomething();
assertTrue(activity.hasDone());
}
}
というふうに、activityを生成してテストしたりできる!