Android 如何测试活动终止->;使用saveInstanceState重新创建生命周期

Android 如何测试活动终止->;使用saveInstanceState重新创建生命周期,android,testing,Android,Testing,我尝试编写一个检测测试来测试活动生命周期,在这个生命周期中,我的活动被终止,它的实例状态被保存,然后用这个实例状态重新创建 我可以通过在设备的开发者设置中将后台进程限制限制为“无后台进程”来手动测试此行为,但我希望能够进行自动测试,以证明我的活动可以重新创建 我的活动有一个id为R.id.content\u frame的片段 因此,我有这个: public class MainActivityInstrumentationTest extends ActivityInstrumentationT

我尝试编写一个检测测试来测试活动生命周期,在这个生命周期中,我的活动被终止,它的实例状态被保存,然后用这个实例状态重新创建

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

我的活动有一个id为R.id.content\u 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());
    }

}
公共类MainActivityInstrumentationTest扩展ActivityInstrumentationTestCase2{
public void testKillCreateLifeCycleWithProfileFragment()抛出可丢弃的{
最终活动=getActivity();
个人资料(活动);
睡眠(5000);
runTestOnUiThread(新的Runnable(){
@凌驾
公开募捐{
活动。重新创建();
}
});
getInstrumentation().waitForIdleSync();
睡眠(5000);
assertProfileFragmentIsVisible((FragmentActivity)活动);
}
私有void资产档案FragmentIsVisible(FragmentActivity活动){
FragmentManager supportFragmentManager=activity.getSupportFragmentManager();
Fragment currentFragment=supportFragmentManager.findFragmentById(R.id.content\u frame);
assertEquals(ProfileFragment.class.getName(),currentFragment.getClass().getName());
}
}
activity.recreate在使用保存的捆绑包创建时会执行所有live cycle回调方法和最终调用,但my
assertProfileFragmentIsVisible
方法中的fragmentManager不包含任何片段

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

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

问候
Frank

以防万一有人对我的最终解决方案感兴趣:

问题是我将对旧活动的引用放到了
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());
}

以防有人对我的最终解决方案感兴趣:

问题是我将对旧活动的引用放到了
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());
}