LoginSignup
22
22

More than 5 years have passed since last update.

画面遷移をrobolectricでテストする

Posted at

概要

Intentを発行して画面遷移する場合についてrobolectricでテストする方法について調べてみた。

テスト対象はEditTextとButtonを持つMainActivityと、TextViewを持つResultActivityからなり、EditTextに文字列に入力してButtonを押すと次の画面に入力された文字列を表示されるアプリとする。

やり方の概要は以下の通り。

  • 遷移元ActivityでpeekNextStartedActivityを使って発行されたIntentを取得する
  • 遷移後ActivityにIntentを渡して生成する

peekNextStartedActivityでIntentを取得する

ActivityをShadow化するとpeekNextStartedActivityでIntentを取得できるようになるので、そこからデータなどを取得して発行されたIntentの内容が正しいことを確認する。

MainActivity mainActivity = Robolectric
        .buildActivity(MainActivity.class).create().get();

mainActivity.editText.setText("test");
mainActivity.button.performClick();

ShadowActivity shadowActivity = Robolectric.shadowOf(mainActivity);
Intent intent = shadowActivity.peekNextStartedActivity();

String actual = intent.getStringExtra("DATA");
assertThat(actual, is("test"));

なお、次に起動するActivityのクラス名を取得したい場合にはIntentもShadow化する必要がある。

ShadowIntent shadowIntent = Robolectric.shadowOf(intent);
String actualClassName = shadowIntent.getComponent().getClassName();
assertThat(actualClassName, is(ResultActivity.class.getName()));

Intentを渡してActivityを生成する

RobolectricでActivityを生成する際にIntentを渡す場合には、withIntentを使う。
使うタイミングはbuildActivityの後。
また、Activityに渡すIntentを自分で生成するためにはRobolectricのContextを渡してあげる必要がある。

Intent intent = new Intent(Robolectric.application.getApplicationContext(), ResultActivity.class);
intent.putExtra("DATA", "test");
ResultActivity resultActivity = Robolectric
        .buildActivity(ResultActivity.class).withIntent(intent).create().get();

String actual = resultActivity.textView.getText().toString();
assertThat(actual, is("test"));
22
22
0

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
22
22