Android Studio で JUnit4 を利用する【基礎編】

2015.02.16

Android Studio を使用して、 JUnit4 のテストを記述してみましょう。
ひとまず、UIテスト用のフレームワークやモックフレームワークは使用せず、最小構成で動かしてみます。

準備

まず、 Android Studio で適当なプロジェクトを用意します。 JUnit4 を使用するために、まずはプロジェクトルートの build.gradle を開き、ビルドツールのバージョンが 1.0.0 以上であることを確認して下さい。

    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0' // or greater
    }

次に、プロジェクトフォルダ直下 (通常は app ) の build.gradle を次のように変更します。

android {
    defaultConfig {
        // ...

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // 追加
    }
}

dependencies {
    // ... 
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1' // or greater
    androidTestCompile 'org.hamcrest:hamcrest-library:1.3' // or greater
}

これで、最小構成のセットアップが完了しました。

テスト記述

基本的には JUnit4 の記述方法そのままです。 JUnit4 の記述方について詳しく知りたい方は、JUnit実践入門 お勧めです!
一点、注意しなければならないのは、テストランナーに AndroidJUnit4 を指定しなければならない点です。

では実際に記述してみましょう!

// 適宜 import 

@RunWith(AndroidJUnit4.class)
public class IntegerTest {

    Integer sut;

    @Before
    public void setUp() throws Exception {
      sut = new Integer(1);
    }

    @Test
    public void 値は1である() throws Exception {
        assertThat(sut, is(1)); 
    }
    
}

Android Studio の Run > Edit Configuration から、テスト用のビルドコンフィグを作成して、テストを実行してみてください。

では次に、 Enclosed ランナーを使用して、テストのコンテキスト毎にテストを分けて記述してみましょう。

// 適宜 import

@RunWith(Enclosed.class)
public class IntegerTest {

    @RunWith(AndroidJUnit4.class)
    public static class 初期値が10 {

       Integer sut;

       @Before
       public void setUp() throws Exception {
           sut = new Integer(10);
       }

       @Test
       public void 値が10である() throws Exception {
           assertThat(sut, is(10));
       }

    }

    @RunWith(AndroidJUnit4.class)
    public static class 初期値が20 {

       Integer sut;

       @Before
       public void setUp() throws Exception {
           sut = new Integer(20);
       }

       @Test
       public void 値が10ではない() throws Exception {
           assertThat(sut, is(not(10)));
       }

    }

}

現在のところ、用意されたデフォルトの AndroidJUnit4 ランナー を使う場合、 Theories ランナーや Categories ランナーを使う出来ません。

よね…? 自分でランナー用意しなくても Theories 使えたよ!という方居られましたら、情報お待ちしています。

今回の前提(最小構成でテストを記述)とは関連しませんが、 Enclosed.class をランナーに指定した場合、そのクラス内のテストからは、Contextを取得するため等に使用する InstrumentationRegistry が利用できません。

まとめ

Android Studio / Gradle を使用しているならば、たったこれだけのことで JUnit4 が利用可能になります。
もう Android でテストを書かない理由がない!

今回は最小構成編ということで紹介できていませんが、 Espressomockito といった強力なフレームワークと合わせると、UIテストの記述やテストダブルの使用ができるようになります。