Модульный тест onSaveInstanceState с ActivityRules

Я пытаюсь выяснить, как протестировать onSavedInstance, используя более новые AndroidJunit4 и Activity Rules.

@RunWith(AndroidJUnit4.class)
public class MyViewActivityTest{

    @Rule
    public UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();

    @Rule
    public ActivityTestRule<MyViewActivity> mActivityRule = new ActivityTestRule<>(MyViewActivity.class);

    @UiThreadTest
    @Test
    public void testOnSavedIntanceState() {
        uiThreadTestRule.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Intent in = new Intent();
                MyViewActivity activity = mActivityRule.launchActivity(in);
                activity.finish();
                activity.recreate();
            }
        });
    }

Я получаю ошибку, не уверенную, лаю ли я по правильному дереву.

java.lang.IllegalStateException: должен вызываться из основного потока на android.app.Activity.recreate(Activity.java:4620)

1 ответ

Решение

Вы должны быть в состоянии выполнить тест с аннотацией @UiThreadTest. Это работает для каждого правила теста, которое распространяется UiThreadTestRule, В этом случае ActivityTestRule случается так и делать.

РЕДАКТИРОВАТЬ:

@UiThreadTest
@Test
public void testOnUIThread() {
    // Test to run on UI thread
}

РЕДАКТИРОВАТЬ:

Я просто запустил его снова и вспомнил, что вы не можете запустить действие в потоке пользовательского интерфейса. Я сделал это и запустил без осложнений.

@RunWith(AndroidJUnit4.class)
public class TestActivity {
   @Rule
   public ActivityTestRule<MyViewActivity> activityRule = new ActivityTestRule<>(MyViewActivity.class, true, false);

   @Test
   public void testOnSavedInstanceState() throws Throwable {
       activityRule.launchActivity(new Intent());

       final Activity activity = activityRule.getActivity();

       activityRule.runOnUiThread(new Runnable() {
          @Override
          public void run() {
             activity.finish();
             activity.recreate();
          }
       });
  }
Другие вопросы по тегам