ちょっとやっかいな部分もあったので、LiveDataのテストをどう書くのかまとめました。

build.gradle

必要なものを追加します。LiveDataを使うので、もちろんArchitectureComponentを追加してます。

同期処理

テスト対象

単純なViewModelをテストしてみます。この例だと、 fetchNameが呼ばれたらLiveDataに文字列を流してるだけです。

テスト

テストコードはこんな感じです。

非同期処理

テスト対象

非同期で処理をして、LiveDataのpostValueで値を流してるだけです。

問題

これを同期処理と同じようにやろうとすると、テスト対象の処理が終わる前にverifyにて検証が行われてしまい、まだ呼び出されていないので、テストが失敗します。

テスト用Observer作成

この問題を回避するために、テスト用のObserverを作ります。

テスト

テストはmockで作ってたObserverを使わずに、先程作ったTestObserverを使うようにしています。

おまけ: InstantTaskExecutorRuleについて

LiveDataのsetValueやpostValue実行されるメソッドが重要になってきます。setValueは必ずMainスレッドから呼び出さなければなりません。また、postValueは最終的にMainスレッドでObserverのonChangedを呼び出します。

java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked.

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO