Тесты активности 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);
    }
}
Другие вопросы по тегам