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()。它永远不会在同一个测试用例中再次调用 onCreate() 。

于 2012-10-08T01:40:40.030 回答
0

找到了!采用

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