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



我正在使用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)

我认为你不能恢复已经被破坏的活动。如果你的活动没有被破坏,只是停止了,那么你可以重新启动并恢复它。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();

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

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

第二个问题是(我可能错了)永远不应该从onDestroy变成onResumehttp://developer.android.com/reference/android/app/Activity.html说灾难后的活动实际上被摧毁了。您必须创建一个新的活动实例才能获得另一个onResume。你可以通过再次启动你的活动来完成。我想你可以用你的方式做,但我不确定它的有效性,如果你想用这种方式做,只需像我链接的问题中提到的那样调用onResume和onDestroy。

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

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());

相关内容

  • 没有找到相关文章

最新更新