如何测试活动杀死 - >使用savedInstanceState创建生命周期

时间:2013-05-03 15:43:07

标签: android testing

我尝试编写一个测试测试,测试我的活动被杀死的活动生命周期,并保存实例状态,然后使用此实例状态重新创建。

我可以通过在我的设备的开发人员设置中将后台进程限制限制为“无后台进程”来手动测试此行为,但我希望能够进行自动测试,以证明我的活动可以重新创建。< / p>

我的活动有一个ID为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遍历所有实时循环回调方法,并使用保存的bundle调用onCreate,但我的assertProfileFragmentIsVisible方法中的fragmentManager不包含任何片段。

此外,我不确定是否使用activity.recreate是一种正确的方法。我尝试了许多其他方法,例如使用getInstrumentation().callActivityOn...手动调用每个生命周期方法,但最终找不到用保存的包创建活动的方法..

关于如何创建这样的仪器测试的任何想法都将不胜感激!

此致 弗兰克

1 个答案:

答案 0 :(得分: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());
}