2013-05-03 3 views
0

Я пытаюсь написать контрольно-измерительный тест, который проверяет жизненный цикл активности, когда моя активность убивается, и состояние экземпляра сохраняется, а затем воссоздается с этим состоянием экземпляра.Как проверить активность kill -> восстановить жизненный цикл с saveInstanceState

Я могу проверить это поведение вручную, ограничив ограничение фонового процесса «отсутствием фоновых процессов» в настройках разработчика моего устройства, но я хочу иметь автоматическое тестирование, которое доказывает, что моя деятельность может быть воссоздана.

В моей деятельности есть фрагмент с идентификатором R.id.content_frame.

Так что для меня это:

public class MainActivityInstrumentationTest extends ActivityInstrumentationTestCase2<MainActivity> { 

     public void testKillCreateLifeCycleWithProfileFragment() throws Throwable { 

     final Activity activity = getActivity(); 

     navigateToProfile(activity); 
     Thread.sleep(5000); 
     runTestOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       activity.recreate(); 
      } 
     }); 
     getInstrumentation().waitForIdleSync(); 
     Thread.sleep(5000); 
     assertProfileFragmentIsVisible((FragmentActivity) activity); 
    } 

    private void assertProfileFragmentIsVisible(FragmentActivity activity) { 
     FragmentManager supportFragmentManager = activity.getSupportFragmentManager(); 
     Fragment currentFragment = supportFragmentManager.findFragmentById(R.id.content_frame); 
     assertEquals(ProfileFragment.class.getName(), currentFragment.getClass().getName()); 
    } 

} 

activity.recreate проходит через все методы живого цикла обратного вызова и ultimalty вызывает OnCreate с сохраненной пачкой но fragmentManager в моем assertProfileFragmentIsVisible метода не содержит никаких фрагментов.

Также я не уверен, следует ли использовать функцию activity.recreate - это правильный путь. Я пробовал много других способов, например, каждый раз называть каждый цикл жизненного цикла с помощью getInstrumentation().callActivityOn..., но в итоге не нашел способа создания активности с сохраненным пакетом.

Любые идеи о том, как я могу создать такой инструментальный тест, будут оценены!

С уважением Frank

ответ

3

Только в случае, если кто-то заинтересован в моем окончательном решении:

Проблема заключалась в том, что я ставлю ссылку на старую деятельность в assertProfileFragmentIsVisible. Но activity.recreate() создает новый экземпляр активности. Проблема остается в том, как получить эту ссылку.

Мне удалось получить ссылку на новую деятельность, используя ActivityMonitor.

Так что мой полный тест теперь выглядит следующим образом:

public void testKillCreateLifeCycle() throws Throwable { 
    Instrumentation.ActivityMonitor mainActivityMonitor = new Instrumentation.ActivityMonitor(MainActivity.class.getName(), null, false); 
    getInstrumentation().addMonitor(mainActivityMonitor); 

    final Activity activity = getActivity(); 
    mainActivityMonitor.waitForActivityWithTimeout(5000); 

    navigateToFragment(activity); 

    runTestOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      activity.recreate(); 
     } 
    }); 
    getInstrumentation().waitForIdleSync(); 

    Activity newActivity = mainActivityMonitor.getLastActivity(); 
    assertFragmentIsVisible((FragmentActivity) newActivity, getExpectedFragment()); 
}