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