5

我正在使用 Robotium 对 Android 应用程序进行功能测试。我想在调用 onDestroy 后测试 onResume 行为。 这篇文章提示使用 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

4 回答 4

2

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

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

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

于 2014-01-14T11:45:18.637 回答
2

我认为您无法恢复已经被破坏的活动。如果您的活动没有被破坏,而只是停止,那么您可以重新启动并恢复它。OnResume 需要在 UI 线程上调用,因此假设您想在 Activity 已经运行后测试恢复状态,您可以这样做:

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

}
于 2013-11-19T19:25:30.190 回答
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());
于 2013-02-20T22:07:53.893 回答
1

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

第二个问题是(我在这里可能错了)永远不会假设从 onDestroy 到 onResume http://developer.android.com/reference/android/app/Activity.html说在 ondestroy 之后活动实际上被破坏了. 您必须创建一个新的活动实例才能获得另一个 onResume。你可以通过再次启动你的活动来做到这一点。我想您可以按照自己的方式进行操作,但我不确定它的有效性,如果您想以这种方式进行操作,只需以与我链接到的问题中所述的 onDestroy 相同的方式调用 onResume 即可。

于 2013-02-18T11:59:47.990 回答