Модульный тест 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();
}
});
}