Android 如何通过使用Robotium调用onResume来自动测试onResume行为?

Android 如何通过使用Robotium调用onResume来自动测试onResume行为?,android,functional-testing,robotium,onresume,ondestroy,Android,Functional Testing,Robotium,Onresume,Ondestroy,我正在使用Robotium对Android应用程序进行功能测试。我想在调用onDestroy后测试onResume行为。 关于使用仪器的提示,但我无法让它工作。 我已经包括了以下内容,但是这失败了,因为有一个非法的例外。 是否可以销毁应用程序并重新启动 public class MainActivityFunctionalTest extends ActivityInstrumentationTestCase2<MainActivity> { private Solo solo;

我正在使用Robotium对Android应用程序进行功能测试。我想在调用onDestroy后测试onResume行为。 关于使用仪器的提示,但我无法让它工作。 我已经包括了以下内容,但是这失败了,因为有一个非法的例外。 是否可以销毁应用程序并重新启动

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

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

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

这里有两个问题,第一个问题是插装callactivityondestroy方法要求您从主线程调用它。有关如何执行此操作的详细信息,请参阅


第二个问题是(我在这里可能错了)不应该从onDestroy转到onResume,因为onDestroy之后,活动实际上被破坏了。您必须创建活动的新实例才能获得另一个onResume。你可以通过再次启动你的活动。我想你可以用你自己的方式来做,但我不确定它的有效性如何。如果你想用这种方式来做,就用我链接到的问题中提到的onResume的方式来调用onResume。

谢谢。我添加并调用了这个

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));
            }
        });
}
或者(在我的情况下)我可以打电话(如果我不想完成终止流程):


我认为你无法恢复已经被破坏的活动。如果您的活动未被销毁,但仅已停止,则可以重新启动并继续。OnResume需要在UI线程上调用,因此假设要在活动已经运行后测试恢复状态,可以执行以下操作:

@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.

}

您可以模拟如下所示的配置更改:

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

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

若要消除此异常,请尝试在instrumentation对象上使用runOnMainSync
@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.

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