gradle-android-toolkitでRobolectricを動かす

2013-10-20T00:00:00+00:00 Android gradle Java 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辺りで設定すれば良いとか

gradle-android-toolkit+Android Studio (1)