Как проверить сохранение и восстановление состояния активности андроида с помощью эспрессо?
Есть ли способ тестирования кода состояния операции сохранения и восстановления программно? Я имею в виду делать это:
Как проверить код, созданный для сохранения / восстановления жизненного цикла действия? но в автоматическом режиме.
Я проверил activity.recreate()
метод, который почти то, что я ищу, но на самом деле он не сбрасывает поля моей деятельности, как если бы я убивал процесс. Так что мой тест может пройти, даже если я не реализую восстанавливающие вещи в моем onCreate
метод (так как мои поля неизменны...).
В настоящее время я играю с Espresso v2, и мне было интересно, если это возможно, возможно, играя с InstrumentationRegistry.getInstrumentation()
?
2 ответа
Решение состоит в том, чтобы использовать activity.recreate()
метод НО не забывайте следовать этому утверждению, которое ожидает состояние простоя. Моя проблема с первой попыткой заключалась в том, что тест, который я писал, был похож на:
instrumentation.runOnMainSync(new Runnable() {
@Override
public void run() {
activity.recreate();
}
});
assertThat(activityTestRule.getActivity().getXXX()).isNull();
куда XXX
было полем, которое, как я ожидал, будет нулевым, если не реализована обработка состояния сохранения / восстановления. Но это было не так, потому что мое утверждение не дожидалось завершения задачи по восстановлению.
Так что в моей ситуации моя проблема была решена, когда я просто добавил утверждение эспрессо, которое выполняет свою работу, например, путем проверки того, что TextView, который отображал XXX
поле было пустым.
Наконец, благодаря синхронизации потока пользовательского интерфейса, предоставленной Espresso, мой тест, который может подтвердить мою отсутствующую реализацию состояния сохранения / восстановления активности, можно записать так:
instrumentation.runOnMainSync(new Runnable() {
@Override
public void run() {
activity.recreate();
}
});
onView(withText("a string depending on XXX value")).check(doesNotExist());
Обратите внимание, что предложенное решение для ротации тоже работает, но может быть намного медленнее, чем activity.recreate()
когда мы просто хотим проверить жизненный цикл активности. И в моем случае это не было актуально, так как моя деятельность не была реализована для альбомной ориентации.
Вы можете повернуть экран и убедиться, что состояние сохранено и восстановлено правильно.
private void rotateScreen() {
Context context = InstrumentationRegistry.getTargetContext();
int orientation
= context.getResources().getConfiguration().orientation;
Activity activity = activityRule.getActivity();
activity.setRequestedOrientation(
(orientation == Configuration.ORIENTATION_PORTRAIT) ?
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE :
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Полный пример: http://blog.sqisland.com/2015/10/espresso-save-and-restore-state.html
Инструменты тестирования, предлагаемые Android, теперь предлагают средства написания тестов пользовательского интерфейса, которые могут воссоздать действие для проверки процесса сохранения и восстановления. См. Раздел " Воссоздать активность " на странице документации для разработчиков Android " Проверка действий приложения". Пример синтаксиса, взятый с этой страницы, следующий:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEvent() {
val scenario = launchActivity<MyActivity>()
scenario.recreate()
}
}