0

アクティビティが強制終了され、インスタンスの状態が保存され、このインスタンスの状態で再作成されるアクティビティのライフサイクルをテストするインストルメンテーション テストを作成しようとしています。

デバイスの開発者設定でバックグラウンド プロセスの制限を「バックグラウンド プロセスなし」に制限することで、この動作を手動でテストできますが、アクティビティを再現できることを証明する自動テストを実行できるようにしたいと考えています。

私のアクティビティには、ID R.id.content_frame のフラグメントがあります。

だから私はこれを持っています:

public class MainActivityInstrumentationTest extends ActivityInstrumentationTestCase2<MainActivity> {

      public void testKillCreateLifeCycleWithProfileFragment() throws Throwable {

        final Activity activity = getActivity();

        navigateToProfile(activity);
        Thread.sleep(5000);
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                activity.recreate();
            }
        });
        getInstrumentation().waitForIdleSync();
        Thread.sleep(5000);
        assertProfileFragmentIsVisible((FragmentActivity) activity);
    }

    private void assertProfileFragmentIsVisible(FragmentActivity activity) {
        FragmentManager supportFragmentManager = activity.getSupportFragmentManager();
        Fragment currentFragment = supportFragmentManager.findFragmentById(R.id.content_frame);
        assertEquals(ProfileFragment.class.getName(), currentFragment.getClass().getName());
    }

}

activity.recreate はすべてのライブ サイクル コールバック メソッドを通過し、最終的に保存されたバンドルで onCreate を呼び出しますが、assertProfileFragmentIsVisibleメソッドの fragmentManager にはフラグメントが含まれていません。

また、 activity.recreate を使用するのが正しい方法かどうかもわかりません。各ライフサイクルメソッドを手動で呼び出すなど、他の多くの方法を試しgetInstrumentation().callActivityOn...ましたが、最終的に保存されたバンドルでアクティビティを作成する方法が見つかりませんでした..

このようなインストルメンテーション テストを作成する方法についてのアイデアをいただければ幸いです。

よろしくフランク

4

1 に答える 1

3

誰かが私の最終的な解決策に興味を持っている場合に備えて:

問題は、古いアクティビティへの参照をassertProfileFragmentIsVisible. ただし、 activity.recreate() は新しいアクティビティ インスタンスを作成します。この参照を取得する方法の問題が残ります。

を使用して、新しいアクティビティへの参照を取得することができましたActivityMonitor

したがって、私の完全なテストは次のようになります。

public void testKillCreateLifeCycle() throws Throwable {
    Instrumentation.ActivityMonitor mainActivityMonitor = new Instrumentation.ActivityMonitor(MainActivity.class.getName(), null, false);
    getInstrumentation().addMonitor(mainActivityMonitor);

    final Activity activity = getActivity();
    mainActivityMonitor.waitForActivityWithTimeout(5000);

    navigateToFragment(activity);

    runTestOnUiThread(new Runnable() {
        @Override
        public void run() {
            activity.recreate();
        }
    });
    getInstrumentation().waitForIdleSync();

    Activity newActivity = mainActivityMonitor.getLastActivity();
    assertFragmentIsVisible((FragmentActivity) newActivity, getExpectedFragment());
}
于 2013-05-06T15:27:58.703 に答える