Вызов функции пересоздания в Robolectric (обратите внимание, что вам не нужно беспокоиться о старых версиях API при использовании Robolectric) довольно близок к симуляции изменения конфигурации, но не обязательно отлавливает все ошибки, которые вы могли сделать.В частности, он не создает новый экземпляр Activity (и я уверен, что он его не «чистит»), поэтому, если вы забыли восстановить поля-члены своей Activity, ваши тесты этого не поймут.Тем не менее, он работает достаточно хорошо для тестирования фрагментов (не сохраненные фрагменты уничтожаются и восстанавливаются).
Если вы вызываете метод create в Activity в тесте Robolectric, происходит следующее:
- onSaveInstanceState
- onPause
- onStop
- onDestroy
- onCreate
- onStart
- onRestoreInstanceState
- onResume
(я выяснил это, переопределив большинство методов жизненного цикла в тестовом задании и поместив в них операторы журналирования)
Вы можете немного приблизиться к реальному изменению конфигурации с помощью коданапример:
Bundle bundle = new Bundle();
activityController.saveInstanceState(bundle).pause().stop().destroy();
controller = Robolectric.buildActivity(YourActivity.class).create(bundle).start().restoreInstanceState(bundle).resume();
activity = controller.get();
(Этот код для Robolectric 2.1 - если вы используете 2.2 или более позднюю версию, вам, возможно, потребуется .visible()
вызов после этого .resume()
)
Используя вышеприведенное, вы увидите следующие события:
- onSaveInstanceState
- onPause
- onStop
- onDestroy
- новый экземплярдеятельности (всеэто новый экземпляр)
- onCreate
- onStart
- onRestoreInstanceState
- onResume
- onPostResume
Это все еще не точное совпадение, но гораздо ближе к тому, что произойдет, когда произойдет реальное изменение конфигурации.
Я думаю, что это может быть достойной симуляцией того, что происходит, когда действие уничтожается из-занехватка памяти, в отличие от вызова restate (), я не думаю, что это сохранит ссылки на сохраненные фрагменты.Хотя я в этой области шаток!
Обновление:
Если ваша активность была запущена с помощью намерения, вам может потребоваться добавить вызов withIntent, например:
Robolectric.buildActivity(YourActivity.class).withIntent(intent).create(bundle) // and so on...