テストの書き方を学ぶためのソースコードを利用したサンプルです。
connpass のイベント情報をリストに表示するアプリに対して Robolectric を利用し JVM 上で動作をするテストを用意しました。
テストを行いやすくするために Dagger2 を利用した DI を導入しています。
pull/1 でテストの無いアプリに対してテストを追加した pull request を作りました。 diff を見ながら何を行ったのかを進めていきます。
ハンズオン型式なので、一部ライブコーディングをしながら進めていきたいと思います。
Connpass API を利用して Android Testing Bootcamp のイベントを取得し、 RecyclerView
に表示します。
主な依存ライブラリとして
- Retrofit2: HTTP 通信
- Dagger2: DI
を利用しています。
Retrofit による通信モジュールやデータ取得を行う Presentation は DI を利用し、テストとそれ以外などのパターンで差し替えを行うことができるようにしています。
Data Binding を利用して API から取得をしたデータの表示を行います。取得したデータそのものは View に直接セットすることができないので、 ViewModel を用意して必要なデータを取り出しやすくしています。
Robolectric と Mockito を利用して JVM 上で動作をするテストを用意しました。
Robolectric や Mockito を利用しない箇所のテストを書きます。 Robolectric は Android の API を JVM 上で動かすためのライブラリ。そのため、 Android SDK に依存をしない箇所については普通の Robolectric を利用しなくても構いません。
junit のみでテストを用意できる gson 生成クラスのテストを書きました
GsonMapperTest.java
API からのレスポンスの json をデシリアライズするために利用する Gson を生成するクラスをテストします。 json 文字列を生成された Gson を利用してシリアライズし、正しくデータをマッピングできるかどうかの確認を行います。
Android SDK に依存をしている部分は Robolectric を利用してテストを書く必要があります。
Robolectric を利用する必要のある部分のテストを書きました
EventRowViewModelTest.java
Connpass API のレスポンスを表示可能なデータ型式とする ViewModel のテストです。 EventRowViewModel
はデータがセットされると View にデータが描画されるため、最終的に描画されたデータの内容をテストします。
Mockito を利用することで class や interface のモックを生成し、処理の結果を操作することで Activity 等のコンポーネントをテストできます。
SuccessLoadEventTest
ConnpassAPI
に依存した �EventListActivity
をテストするために、 ConnpassAPI
をモックし、 Robolectric 用に作った Application のサブクラスを利用してモックを Dagger によって DI します。
その結果、画面に描画されるデータを検証することでデータの取得と描画が行われていることをテストします。