gradle-android-toolkitでRobolectricを動かす
Robolectricなテストプロジェクトをgradleで動かすなネタと若干似てますけど、こっちではandroid toolkitなgradleプラグインを用いてAndroidアプリをビルドする、testタスクを利用してsrc/test/javaにあるクラスをRobolectric利用でテストを実行するっていう方式をやってみた
/app/src/test/java/sample/test/MainActivityTest.java
package sample.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ActivityController;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
@Config(manifest = Config.NONE)
@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {
@Test
public void test1() {
ActivityController<MainActivity> controller = Robolectric.buildActivity(
MainActivity.class
);
MainActivity activity = controller.create().get();
assertThat(activity.toast, nullValue());
controller.start();
// わざとテストずっこけるようにしている。実際はNotNull
assertThat(activity.toast, nullValue());
}
}
んなテストを用意しておいて、それをgradleで動かすだけ
/app/build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:0.6.1"
}
}
apply plugin: "android"
sourceSets {
unitTest {
java.srcDir file("src/test/java")
}
}
repositories {
mavenCentral()
}
dependencies {
unitTestCompile files("/opt/android/platforms/android-18/android.jar")
unitTestCompile files("${buildDir}/classes/release")
unitTestCompile "junit:junit:4.11"
unitTestCompile "org.hamcrest:hamcrest-all:1.3"
unitTestCompile "org.robolectric:robolectric:2.2"
}
android {
compileSdkVersion 18
buildToolsVersion "18.1.1"
defaultConfig {
minSdkVersion 8
targetSdkVersion 18
}
}
task test(type: Test, dependsOn: assemble) {
testClassesDir = sourceSets.unitTest.output.classesDir
classpath = sourceSets.unitTest.runtimeClasspath
}
check.dependsOn test
一応微妙な点を書くと
- テストするにあたってのandroid.jarのクラスパスをしないといけない
- src/test/javaがAndroid Studioでソースディレクトリとして認識してくれない
2に関してはAndroid Studioでsrc/test/javaなところをSource Rootとして設定すれば問題無い模様
という感じでtestタスクを動かすと
以上。Robolectricプラグインはあるし普通にそれ使えば良くねっていう感じなんだがなって所
余談
Androidの通常のテスト方式であるInstrumentationTestRunnerなテストはsrc/instrumentTest/javaに書けば良い模様。なんかドキュメントに「run instrumentTest」とかそんな感じで書いてるけどタスク一覧みてもそれが無い。「connectedInstrumentTest」かなって思って実行したら普通に実行できた
ちなみにsrc/instrumentTestは変更できるっぽそう。sourceSets -> instrumentTest.setRoot辺りで設定すれば良いとか