5

Robotiumを使用してAndroidアプリを機能的にテストしています。onDestroyが呼び出された後、onResumeの動作をテストしたいと思います。 この投稿はインストルメンテーションの使用を示唆していますが、動作させることができません。以下を含めましたが、これは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

すでに破壊されている活動を再開することはできないと思います。アクティビティが破棄されずに停止しただけの場合は、再開して再開できます。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.

}
于 2013-11-19T19:25:30.190 に答える
2

次のように構成の変更をシミュレートできます。

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

これにより、アクティビティの新しいインスタンスが作成され、ライフサイクルを正しく通過する必要があります(新しいアクティビティに復元するバンドルを渡すことを含む)。これはHoneycomb(APIレベル11)以降でのみ機能することに注意してください。

于 2014-01-14T11:45:18.637 に答える
1

ここには2つの問題があります。最初の問題は、インストルメンテーションcallactivityondestroyメソッドでは、メインスレッドから呼び出す必要があるということです。これを行う方法の詳細については、 runOnUiThreadの使用に関するヒントを参照してください。

2番目の問題は(そして私はここで間違っているかもしれません)onDestroyからonResumeに行くことは決して想定されていないということですhttp://developer.android.com/reference/android/app/Activity.htmlは、ondestroyの後にアクティビティが文字通り破壊されると言っています。別のonResumeを取得するには、アクティビティの新しいインスタンスを作成する必要があります。あなたと一緒にあなたの活動を再び開始することによって行うことができます。私はあなたがそれをあなたのやり方で行うことができると思いますが、それがどれほど有効であるかわかりません、あなたがそのような方法でそれをしたいのであれば、私がリンクした質問で述べたようにonDestroyと同じ方法でonResumeを呼び出すだけです。

于 2013-02-18T11:59:47.990 に答える
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 に答える