Robolectricのアップデートについてのメモです
公式の記事
http://robolectric.org/blog/2019/06/04/paused-looper/
RobolectricはUIとテストで同じスレッドを共有していて、以下のようなパターンでテストが失敗します。
理由はbefore, after, between
になりpostを即座に同期的に実行するためです。
本当のHandlerであれば、postが後から実行されるため、うまく通るはずです。
http://robolectric.org/blog/2019/06/04/paused-looper/ より引用
List<String> events = new ArrayList<>();
events.add("before");
new Handler(Looper.getMainLooper()).post(() -> events.add("after"));
events.add("between");
assertThat(events).containsExactly("before", "between", "after").inOrder();
そこで @LooperMode(PAUSED)
が追加されました。これはクラスやメソッドにつけます。Robolectric 4.4以降ではこちらがデフォルトになりました。
主に違うところはこちら
- このモードだと自動的に同期的にHandlerにpostした処理が実行はされない。ShadowLooper APIを使って
ShadowLooper.idle()
など、明示的に実行する必要がある。その代わり以下の改善がされた。 - 未実行のタスクでテストが失敗したらユーザーに教えてくれるようになった
- AndroidXのいくつかのAPI(FragmentScenarioなど)では自動的にキューを空にしてくれる
- バックグラウンドルーパーを使っている場合は本当にスレッドで実行される
他にもいくつかの違う点があるようです。
http://robolectric.org/javadoc/4.4/org/robolectric/annotation/LooperMode.Mode.html