LiveData&CoroutinesのUnitテスト

Env

Kotlin 1.3.0-rc-57

kotlinx.coroutines 0.26.1-eap13

Architecture Components 1.1.1

Mockito-Kotlin 2.0.0-RC2

TL;DR

Architecture Components用のテストライブラリを導入する

testImplementation "android.arch.core:core-testing:1.1.1"

テストルールを書く

@get:Rule
val rule: TestRule = InstantTaskExecutorRule()

コルーチンの実行スレッドを切り替える

Dispatchers.Unconfined or runBlocking {}

Test target

今回は、購入履歴をAPIから取ってきて、ViewModelに渡して、DataBindingを使って表示する というケースを前提としています。

また、取得中はプログレスを表示したいので、Loadingという状態を管理するようにします。

Test code

余談

RxAndroidPluginみたいに、DIしないでも実行スレッドを切り替えられないかなと探してみました。

UI android context and Looper.getMainLooper() not mocked · Issue #102 · Kotlin/kotlinx.coroutines

Image from Gyazo

素直にDIしろってことですね、わかります。

Jake神がそういうなら仕方ないxD