Espressoで、Activityの単体テストをする場合、IntentのExtraで対象となるActivityに情報を渡したいときがあります。
そういった場合は、ActivityTestRuleをコンストラクタで、3番目の引数にfalseを渡せば、勝手にActivityを起動しなくなります。
@RunWith(AndroidJUnit4.class)
public class FooActivityTest {
@Rule
public ActivityTestRule<FooActivity> activityRule = new ActivityTestRule<>(FooActivity.class, false, false);
:
}
この引数は省略したときはtrueになり、その場合、@Testメソッド毎に、最初の@Beforeメソッドが実行される前に、Activityが起動します。
falseを指定すると、Activityが自動的に起動しなくなるので、@BeforeメソッドでIntentを使って明示的に起動します。
@RunWith(AndroidJUnit4.class)
public class FooActivityTest {
@Rule
public ActivityTestRule<FooActivity> activityRule = new ActivityTestRule<>(FooActivity.class, false, false);
:
@Before
public void setup() {
:
Intent intent = new Intent();
intent.putExtra("bar", 1); //必要なデータを渡す
activityRule.launchActivity(intent);
}
:
}
このとき、ClassNameなどは、ActivityTestRuleのlaunchActivity()メソッド内でセットしてくれるので、必要なExtraの設定だけでかまいません。
@Beforeメソッドが複数ある場合は、実行順序に気をつけなければならなくなるので、ひとつのメソッドにまとめた方が良さそうです。