LoginSignup
7
2

More than 3 years have passed since last update.

Robolectric 4.4でデフォルトになった@LooperMode(PAUSED)についてメモ

Last updated at Posted at 2020-09-28

Robolectricのアップデートについてのメモです :pencil:

公式の記事
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

7
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2