Тесты активности Android - тестирование перезапускается
Как в разделе " Основы тестирования", так и в разделе " Тестирование активности ", озаглавленном "Добавление тестов управления состоянием" в документации для разработчиков Android, предлагается возобновить тестирование с использованием:
mActivity.finish();
mActivity = this.getActivity();
Попробовав это с добавлением спящего режима между двумя приведенными выше инструкциями, я вижу, что действие не перерисовывается на экране, когда выполняется mActivity = this.getActivity(). Мой тест, похоже, работает, но я заинтригован, почему Activity не перерисовывается на экране, так как это, кажется, не упоминается в документации API.
Я был бы благодарен за любое понимание этого, которое может дать любой. В тот момент, когда вызывается метод finish (), действие исчезает с экрана, но не появляется снова при вызове this.getActivity (). Я также попытался поместить mActivity.setVisible (true) после getActivity (), но это не помогает.
Мой фрагмент кода теперь:
...
mActivity.finish();
Thread.sleep(5000);
mActivity = this.getActivity();
Thread.sleep(5000);
...
Я много раз искал, но не могу найти объяснения, почему Activity не появляется снова при вызове getActivity ().
Я проверил это на Android 2.3.5, 2.3.3 и 2.2.2 с одинаковым результатом.
1 ответ
Кажется, что класс ActivityInstrumentationTestCase2 нуждается в дополнительном методе финиша, в котором необходимо выполнить некоторую очистку. В то же время вы можете обойти эту проблему, убрав себя после завершения упражнения. Поэтому измените ваш код следующим образом:
mActivity.finish();
setActivity(null);
mActivity = this.getActivity();
Это можно объяснить следующим образом. Метод getActivity в классе ActivityInstrumentationTestCase2 вызывает setActivity(a)
public T getActivity() {
Activity a = super.getActivity();
if (a == null) {
// set initial touch mode
getInstrumentation().setInTouchMode(mInitialTouchMode);
final String targetPackage =
getInstrumentation().getTargetContext().getPackageName();
// inject custom intent, if provided
if (mActivityIntent == null) {
a = launchActivity(targetPackage, mActivityClass, null);
} else {
a = launchActivityWithIntent(targetPackage,
mActivityClass,
mActivityIntent);
}
setActivity(a);
}
return (T) a;
}
Метод setActivity устанавливает внутреннюю переменную mActivityIntent.
public void setActivityIntent(Intent i) {
mActivityIntent = i;
}
Все вызовы после этого первого вызова теперь будут использовать новое значение mActivityIntent вместо нулевого значения. В следствии
a = launchActivityWithIntent(targetPackage, mActivityClass, mActivityIntent);
будет называться. Вероятно, ваше приложение не может быть запущено с этим намерением.
Обратите внимание, что метод tailDown выполняет правильную очистку:
protected void tearDown() throws Exception {
// Finish the Activity off (unless was never launched anyway)
Activity a = super.getActivity();
if (a != null) {
a.finish();
setActivity(null);
}
}