2012-01-13 2 views
2

В обоих Testing Fundamentals и секция Activity Testing под названием «Добавление тестов государственного управления» в документации для разработчиков Android, это предполагает тестирование активности перезагружается с помощью:Android тесты Активность - Тестирование Перезапуск

mActivity.finish(); 
mActivity = this.getActivity(); 

Попробовав это с добавлением от сна между двумя вышеприведенными утверждениями, я вижу, что действие не перерисовывается на экране при выполнении mActivity = this.getActivity(). Мой тест, похоже, работает, но я заинтригован, почему активность не перерисовывается на экране, поскольку это, похоже, не упоминается в документации API.

Буду благодарен за любое понимание этого, которое может дать любой. В тот момент, когда вызывается метод finish(), Activity исчезает с экрана, но не появляется, когда вызывается this.getActivity(). Я также попытался установить mActivity.setVisible (true) после getActivity(), но это не помогает.

Мой фрагмент кода теперь:

... 
mActivity.finish(); 
Thread.sleep(5000); 
mActivity = this.getActivity(); 
Thread.sleep(5000); 
... 

Я искал обширно, но не может найти никакого объяснения, почему активность не появляется, когда getActivity() называется.

Я тестировал это на Android 2.3.5, 2.3.3 и 2.2.2 с одинаковым результатом.

+1

Спасибо за этот вопрос, потому что мой UIThread код не будет работать, когда поток пользовательского интерфейса не был на экране! – Noumenon

ответ

8

Кажется, что для класса ActivityInstrumentationTestCase2 нужен дополнительный метод завершения, в котором необходимо выполнить некоторую очистку. Тем временем вы можете обойти эту проблему, очистившись после завершения деятельности. Поэтому измените свой код следующим образом:

mActivity.finish(); 
setActivity(null); 
mActivity = this.getActivity(); 

Это можно объяснить следующим образом. Метод getActivity в классе ActivityInstrumentationTestCase2 вызывает setActivity (а)

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); 

будет называться. Возможно, ваше приложение не может начаться с этого намерения.

Обратите внимание, что метод rearDown делает правильную очистку:

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); 
    } 
} 
+0

Этот ответ исправил мою проблему, когда мой код потока пользовательского интерфейса загадочно не работал после 'activity.finish()', что нанесло поражение всей цели тестирования onDestroy. Спасибо. – Noumenon

+0

Из документов: Завершите действие и перезапустите его: ** mActivity.finish(); ** ** mActivity = this.getActivity(); ** Они должны действительно обновить документацию ... – Decoy

+0

Большое спасибо за находя это. – Decoy

Смежные вопросы