2012-01-13 49 views
2

在這兩個Testing Fundamentals和題爲Android開發者文檔中的「添加狀態管理測試」的Activity Testing部分,它表明測試活動重新開始使用:Android的活動測試 - 測試重新啓動

mActivity.finish(); 
mActivity = this.getActivity(); 

已經與另外試過這種在上述兩個語句之間,我可以看到當執行mActivity = this.getActivity()時,Activity不會在屏幕上重新繪製。我的測試看起來很有效,但我很好奇爲什麼活動不會在屏幕上重新繪製,因爲這似乎沒有在API文檔中提及。

我會很感激任何人都可以給任何見解。在調用finish()方法時,Activity從屏幕上消失,但在調用this.getActivity()時不會重新出現。我也試過在getActivity()之後放置一個mActivity.setVisible(true),但這沒有幫助。

我的代碼片斷現在是:

... 
mActivity.finish(); 
Thread.sleep(5000); 
mActivity = this.getActivity(); 
Thread.sleep(5000); 
... 

我已經廣泛搜查,但找不到原因時getActivity()被調用的活動沒有再出現任何解釋。

我已經在Android 2.3.5,2.3.3和2.2.2上測試過,所有結果都一樣。

+1

謝謝你問這個問題,因爲在UI線程是不是在屏幕上我的UIThread代碼將無法運行! – Noumenon 2013-07-30 14:58:35

回答

8

看來類ActivityInstrumentationTestCase2需要一個額外的完成方法,其中必須完成一些清理。與此同時,您可以在完成活動後通過清理自己來解決此問題。因此,更改您的代碼如下:

mActivity.finish(); 
setActivity(null); 
mActivity = this.getActivity(); 

這可以解釋如下。方法getActivity類ActivityInstrumentationTestCase2調用setActivity的(a)

public T getActivity() { 
    Activity a = super.getActivity(); 
    if (a == null) { 
     // set initial touch mode 
     getInstrumentation().setInTouchMode(mInitialTouchMode); 
     final String targetPackage = 
      getInstrumentation().getTargetContext().getPackageName(); 
     // inject custom intent, if provided 
     if (mActivityIntent == null) { 
      a = launchActivity(targetPackage, mActivityClass, null); 
     } else { 
      a = launchActivityWithIntent(targetPackage, 
             mActivityClass, 
             mActivityIntent); 
     } 
     setActivity(a); 
    } 
    return (T) a; 
} 

方法setActivity設置內部變量mActivityIntent。

public void setActivityIntent(Intent i) { 
    mActivityIntent = i; 
} 

這第一個電話後,所有呼叫現在將使用新的值mActivityIntent而不是一個空值。因此,

a = launchActivityWithIntent(targetPackage, mActivityClass, mActivityIntent); 

將被調用。可能你的應用不能以這個意圖開始。

注意方法rearDown做了適當的清理:

protected void tearDown() throws Exception { 
    // Finish the Activity off (unless was never launched anyway) 
    Activity a = super.getActivity(); 
    if (a != null) { 
     a.finish(); 
     setActivity(null); 
    } 
} 
+0

這個答案解決了我的問題,其中我的UI線程代碼在'activity.finish()'後面神祕地沒有運行,這打敗了測試onDestroy的全部目的。謝謝。 – Noumenon 2013-07-30 15:03:16

+0

來自文檔:終止活動並重新啓動它: ** mActivity.finish(); ** ** mActivity = this.getActivity(); **他們應該真的更新文檔... – Decoy 2014-09-23 14:39:16

+0

非常感謝找到這個。 – Decoy 2014-09-23 14:40:24