2011-05-05 198 views
0

我正在測試一個銷燬/重新啓動序列,以確保計數器保留其原始值(在重新啓動時不正確地增加之前)。當我手動測試時,我修復了一個問題並且工作正常。但單元測試總是通過,無論我是否包含修復。正如你在下面的代碼中看到的,我得到了計數器值,然後重新啓動,再次獲得計數器值並對它們進行比較。可能是什麼問題呢?Android:如何使單元測試失敗

public void testNumCorrectEqualAfterDestroy() { 

mCorrect = (TextView) mActivity.findViewById(R.id.correct); 

    int before = Integer.parseInt(mCorrect.getText().toString()); 
    mActivity.finish(); 
    mActivity = this.getActivity(); 

mCorrect = (TextView) mActivity.findViewById(R.id.correct); 

    int after = Integer.parseInt(mCorrect.getText().toString()); 

    Assert.assertEquals(before, after); 

    } 
+0

嘗試添加一個assertTrue(false);在那裏只是爲了確保測試正在運行。這個測試與其他運行的測試是否在同一個類中? – Dan 2011-05-05 21:49:59

+0

它絕對在運行。它顯示在運行的測試列表中,並且調試語句(此處未包括)顯示在控制檯上。可以肯定的是,我添加了assertTrue(false),並且失敗了。 – 2011-05-05 21:58:12

+0

你如何設置** mCorrect **的默認值?在這種情況下,在我看來,**之前的**和**之後的**都具有相同的值,即默認值,這將解釋每次通過的測試。 – dmon 2011-05-05 23:06:01

回答

1

我認爲finish()將不會通過「適當」狀態循環您的活動。我之前測試過這種生命週期情況的方法是,像這樣:

... 
//TODO: do not use getActivity, instead use the startActivity() method 
//and pass a value in the Bundle parameter 
... 
getInstrumentation().callActivityOnStart(mActivity); 
getInstrumentation().callActivityOnResume(mActivity); 
//TODO: asssert that the value is the expected one (based on what you fed in the bundle) 
Bundle newBundle = new Bundle(); 
getInstrumentation().callActivityOnSaveInstanceState(mActivity, newBundle); 
getInstrumentation().callActivityOnPause(mActivity); 
getInstrumentation().callActivityOnStop(mActivity); 
getInstrumentation().callActivityOnDestroy(mActivity); 

//initialize activity with the saved bundle 
getInstrumentation().callActivityOnCreate(mActivity, newBundle); 
getInstrumentation().callActivityOnResume(mActivity); 

//TODO: assert that the value is the expected one 
+0

謝謝 - 很好的答案。有一點需要注意,它必須在UI線程上運行,所以我添加了這個註釋:@UiThreadTest – 2011-05-06 12:23:44

0

ActivityInstrumentationTestCase2.getActivity()開始活動的第一次調用它,然後它只是返回該活動在測試情況下,每個後續調用。因此,您仍在查看完成的活動。

完成第一個活動後,您需要從測試中啓動一個新活動。例如,您可以使用InstrumentationTestCase.launchActivity()

另一個例子,我寫了一個測試,在ActivityA中按下一個按鈕,啓動ActivityB for-result;然後測試立即殺死ActivityA(通過方向更改,但finish()也可以),然後測試獲取新ActivityA的句柄,當ActivityB完成併發送結果時,系統創建該ActivityA。這裏的技巧是讓測試添加一個Instrumentation.ActivityMonitor,然後讓該監視器等待系統啓動新的ActivityA並給測試一個句柄。