概要
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"));