0

単体テストがあり、アプリを破棄して終了した後、getActivity() を再度呼び出して、アプリが正しく読み込まれることを確認します。ただし、onCreate() を呼び出していません。

public void testHistory() { 
            ...
    mActivity.onPause(); 
    mActivity.finish(); 
    assertTrue(mActivity.getExtractor() == null);
    assertTrue(mActivity.getSettings() == null);
    Log.d(TAG, "**************  Restarting app to verify load.");
    mActivity = getActivity(); 
    assertTrue(mActivity != null);
    assertTrue(mActivity.getExtractor() != null); //////// THIS FAILS!!!

ここにログがあります

10-07 21:11:40.467: D/SpeedyReader(15441): onPause()
10-07 21:11:40.514: D/SpeedyReader(15441): Saving 5 articles, 1 historical articles...
10-07 21:11:40.709: D/SpeedyReader(15441): Saved articles. success: true, length: 88218
10-07 21:11:40.764: D/SpeedyReader(15441): onStop()
10-07 21:11:40.764: D/SpeedyReader(15441): onDestroy()
10-07 21:11:40.772: D/SpeedyReader(15441): finish()
10-07 21:11:40.772: D/SpeedyReader(15441): **************  Restarting app to verify load.
10-07 21:11:40.772: D/SpeedyReader(15441): finish()
10-07 21:11:40.897: D/SpeedyReader(15441): onCreate()
10-07 21:11:40.944: D/SpeedyReader(15441): finalize()
10-07 21:11:40.944: D/SpeedyReader(15441): Settings.load() wpm:300
10-07 21:11:40.944: D/SpeedyReader(15441): Loading articles...

ログ ファイルに onCreate と表示される理由がわかりません。onCreate() が非同期で呼び出されているようです! これが私の onCreate() です。

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.d(TAG, "onCreate()");
    ....
    extract = new Extractor();

私はwaitForIdleSync()を試しました

    Log.d(TAG, "**************  Restarting app to verify load.");
    mActivity = getActivity(); // restart the app, reload the history
    getInstrumentation().waitForIdleSync(); // ------------ NEW

しかし、それは役に立ちませんでした。

4

2 に答える 2

1

フレームワークに関する限り、これは予想される動作だと思います。

ActivityInstrumentationTestCase2 または ActivityUnitTestCase を拡張していると仮定しています。ActivityUnitTestCaseは、finish() が何もしないと述べています。非同期動作に関しては、通常、InstrumentationThread からテストを実行します。ライフサイクルのコールバックはメイン スレッドから呼び出す必要があると思います。これは、サンプル コードでは行われていません。

onCreate が呼び出されていないインスタンスについては、getActivity() は onCreate() が正しく呼び出されたと主張しますが、残りはあなた次第です。同じテスト呼び出し内のアクティビティで finish() を呼び出しても、実際のライフサイクルに関する限り何もしません。アクティビティの登録が自動的に解除されることはありません。アクティビティの finish() メソッドでのみコードを実行します。getActivity() は複数回呼び出すことができ、同じインスタンスで onCreate() を 1 回だけ呼び出すことができるためです。同じテスト ケース内から onCreate() を再度呼び出すことはありません。

于 2012-10-08T01:40:40.030 に答える
0

それを見つけた!使用する

    getInstrumentation().callActivityOnCreate(mActivity, null);
于 2012-10-08T02:16:48.617 に答える