はじめに
前回の記事Androidのユニットテストを高速化するでRobolectricを利用すると良いのでは?って書いたので使ってみました。この方法を実践することでAndroidのユニットテストをJVMで実行することができ、テストの高層化につながります。
Andrroid gradle pluginが1.1以上であればInstrumentation Testと共存できるのでバージョンの確認を行いましょう。
やりかた
Android gradle pluginのバージョンが1.1以上になっているのが望ましいです。1.1以前だと、Instrumentation Testと共存することができないっぽいです。
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
次に依存関係を解決します。バージョンなどは公式サイトやリポジトリを見て読み替えてください。
dependencies {
testCompile 'org.robolectric:robolectric:3.0-rc3'
}
これで準備ができました。Android Studioを利用している場合はBuild Variants
のTest Artifact
をUnit Tests
に変更します。
テストを書く
テストのソースコードはsrc/test/java
以下へ格納し、JUnit4の形式でテストを書きます。Robolectricを利用するテストクラスはクラスのアノテーションにRunWith(RobolectricTestRunner.class)
が必要です。また必要に応じてConfig
アノテーションで設定をすることでAPIのバージョンの指定などができます。
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildCOnfig.class)
public class MyClassTest {
private String json;
@Before
public void loadJSON() {
json = loadJson();
}
@Test
public void initiJson() {
assertThat(TextUtils.isEmpty(json), is(not(true)));
}
}
制約とか
Robolectricではネイティブライブラリを読むことができません。またこれはRobolectricだけでなく前回紹介したJVM上でのテスト実行でもサポートされていないそうです。そのため、ネイティブライブラリに依存する機能のテストはInstrumentation Testで行う必要があるようです。
終わりに
Robolectricを利用したテストの方法を紹介しました。エミュレータやデバイスを利用しないので高速に動く分、ランタイムがJVMになる点については注意が必要かもしれません。そういった部分を意識しつつも高速に高品質なアプリを作っていきたいですね。