2012-01-15 51 views
6

我有幾個簡單的測試,如assertNotNull(mActivity);(我正在閱讀M.D.Torres的「Android應用程序測試指南」)。被測活動運行良好。每一個測試都可以運行。但是,如果我在第二次測試一次運行幾次測試永遠不會返回。 logcat中沒有錯誤(最後一行「Starting Intent ...」),沒有任何錯誤。調試也沒有多大幫助,如果我步入getActivity(),它會抱怨沒有可用的源代碼。
另一個測試項目 - Google的ActivityTesting運行正常,即使有幾個測試,所以Eclipse的配置是正確的。
有沒有人遇到類似的東西?第二次測試getActivity()永不返回

回答

8

我再次重新創建測試項目(如「潔淨室」),它工作。然後我比較了兩個項目並找到了罪魁禍首。這是空的拆解:

protected void tearDown() throws Exception { 
} 

如果我刪除它,所有測試運行綠色。如果我粘貼它,第二個測試掛起。現在我想閱讀解釋並準備好將其標記爲答案。

編輯:我應該在tearDown方法的結尾呼叫super.tearDown()。 抱歉打擾大家。

+0

真棒,謝謝。 – 2012-03-06 19:56:44

+0

你不是唯一一個。謝謝! – iewnait 2012-12-03 22:58:51

+0

我也有這個問題,所以你不會因爲問問題而煩擾任何人。我非常感謝您在解決方案中添加的內容! – jwir3 2014-01-29 18:59:24

1

我使用了ActivityInstrumentationTestCase2來測試一個使用ExoPlayer的Activity並且正確地清理資源。由於所有測試的清理和最終檢查都是相同的,我認爲tearDown()是實現它們的好地方。所有測試單獨運行沒有任何問題,但是當我運行多個測試時,有時getActivity()沒有返回。我拆解()來實現不同的東西:活動

  • 檢查狀態(各種斷言()調用)播放器的
  • 檢查狀態(各種斷言()調用)
  • 手動清理的球員資源(通過調用close ()和release())
  • setActivity(空)(這引起了麻煩)
  • super.tearDown()

我嘗試了所有建議的解決方法比如重寫getActivity()並使用其他方法來創建和清理活動。這些方法沒有幫助。

大量的調試顯示,在上述情況下,先前測試活動的onDestory()可以與下一個測試活動的onCreate()重疊。因此,日誌顯示順序的生命週期事件:

test1.getActivity(); 
test1.tearDown() called; 
test1.tearDown() over; 
test2.getActivity() 
test2.onCreate(); 
test1.onStop(); --> why is this late? 
test1.onDestroy(); --> why is this late? 
test2.tearDown() called; 
test2.tearDown() over; 
test3.getActiviy() --> this should call test3.onCreate, but did not and never returned. 

發生這種情況即使在測試案例在不同的ActivityInstrumentationTestCase2類/文件的貫徹落實。第一次重疊並不會造成麻煩,所以2次測試總是OK,但以任何次序運行3次測試會導致此重疊,導致第3次調用getActivity()永遠不會返回。

我嘗試了所有的方法,例如手動使用工具調用onPause()+ onStop()+ onDestroy(),在測試之間引入非常長的睡眠時間,強制清除instrumentationTestCase的活動,重新排序tearDown的檢查,但沒有任何幫助。最後,我不小心刪除我的支票之前setActivity(空),以及生命週期事件得到正確排序:

test1.tearDown() called; 
test1.onStop(); 
test1.onDestroy(); 
test1.tearDown() over; 
test2.getActivity() 
test2.onCreate(); 
... 

所以真正讓我的情況的區別:不調用ActivityTestCase.setActivity()。這導致super.tearDown()不直接調用活動的生命週期事件,清理將在以後發生並造成麻煩。

相關問題