如何使用Robotium调用onDestroy自动测试onResume行为?

时间:2013-02-17 20:22:06

标签: android functional-testing robotium onresume ondestroy

我正在使用Robotium对Android应用进行功能测试。我想在调用onDestroy之后测试onResume行为。 This post提示使用Instrumentation,但我无法使用它。 我已经包含以下内容,但是这会因IllegalStateException而失败。 是否有可能破坏应用程序并重新启动它?

public class MainActivityFunctionalTest extends ActivityInstrumentationTestCase2<MainActivity> {
private Solo solo;

public MainActivityFunctionalTest() {
    super(MainActivity.class);
}

public void testActionList() {
    getInstrumentation().callActivityOnDestroy(solo.getCurrentActivity());
    ...
}

导致以下异常:

java.lang.IllegalStateException: Must be called from main thread of process at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1373) at android.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1825) at android.app.Activity.performDestroy(Activity.java:5171) at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1109) at nl.handypages.trviewer.test.MainActivityFunctionalTest.testActionList(MainActivityFunctionalTest.java:81) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199) at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)

4 个答案:

答案 0 :(得分:2)

我认为你不能恢复已被销毁的活动。如果您的活动未被销毁,但只是停止,那么您可以重新启动并恢复它。需要在UI线程上调用OnResume,因此假设您想在活动运行后测试恢复状态,您可以这样做:

@UiThreadTest
public void testResumeAfterStop() {
    Instrumentation instr = this.getInstrumentation();

    // here, test or record down whatever should be tested 
    // when the activity is in resume state the first time

    instr.callActivityOnPause(getActivity());
    instr.callActivityOnStop(getActivity());
    instr.callActivityOnRestart(getActivity());
    instr.callActivityOnStart(getActivity());
    instr.callActivityOnResume(getActivity());

    // Now you are in the resume state again. 
    // Test whatever you need here.

}

答案 1 :(得分:2)

您可以模拟这样的配置更改:

    getInstrumentation().runOnMainSync(new Runnable() {
        @Override
        public void run() {
            activity.recreate();
        }
    });
    setActivity(null);
    activity = getActivity();

这将导致创建活动的新实例,并且它应该正确地经历生命周期(包括将包恢复到新活动)。请注意,这仅适用于Honeycomb(API级别11)及更高版本。

答案 2 :(得分:1)

嗯,这里有两个问题,第一个问题是检测callactivityondestroy方法需要你从主线程中调用它。有关如何执行此操作的详细信息,请参阅runOnUiThread usage tips

第二个问题是(我可能在这里错了)从来没有想过从onDestroy转到onResume http://developer.android.com/reference/android/app/Activity.html说在ondestroy之后,活动被彻底摧毁了。您必须创建活动的新实例才能获得另一个onResume。你可以再次发起你的活动。我想你可以按照自己的方式去做,但我不确定它有多有效,如果你想以这种方式做到这一点,只需按照onDestroy的方式调用onResume,如我所链接的问题中所述。

答案 3 :(得分:1)

感谢。我添加并称之为。

public void callActivityOnDestroy(final Activity activity){
    getInstrumentation().runOnMainSync(new Runnable() {
            public void run() {
                activity.finish();
            }
        });
}
public void callActivityStart(final Activity activity){
    getInstrumentation().runOnMainSync(new Runnable() {
            public void run() {
                activity.startActivity(new Intent(activity, MainActivity.class));
            }
        });
}

另外(在我的情况下)我可以打电话(如果我不想完成杀死过程):

getInstrumentation().callActivityOnStop(getActivity());
getInstrumentation().callActivityOnRestart(getActivity());