2012-11-12 75 views
2

我必須缺少明顯的東西在這裏:涉及Android系統的儀器測試應用程式

我的設備上運行的儀器測試的情況下,也與Robotium的幫助。在某些時候,我的測試應用程序會導致默認的電子郵件撰寫活動觸發。

我想知道的是:如何關閉該活動以便再次顯示我的應用活動?出於以下原因,至少需要:在當前測試用例完成後,電子郵件活動仍保留在前臺,這樣可以防止下一個測試用例正常運行。

我試圖發送所需的後退鍵到電子郵件活動 - 與this.sendKeys(KeyEvent.KEYCODE_BACK)solo.goBack() - 但沒有運氣。

如果我運行solo.getCurrentActivity()this.getActivity()我得到一個參考包內最上面活動,但沒辦法得到的實際前景活動的舉行。另外,提到的sendKeys/goBack直接去了我的活動,而不是電子郵件。

當我的應用程序啓動Play商店主要活動時出現同樣的問題。
我意識到電子郵件活動不是我測試的軟件包的一部分,這可能是問題的一部分。

那麼,有沒有辦法關閉電子郵件提示?

編輯
現在我堅持@Joe馬林第一個建議:

在我的視圖模型(或Controller),有private static boolean _productionMode = true; ,並且有一定的輔助方法(在某些內助更好,如果

public void dontLaunchExternalApps() 
{ 
    _productionMode = false; 
} 

然後,在一些視圖模型常規方法:

if (_productionMode) 
{ 
    launchSomeExternalApp(); 
} 
else 
{ 
    // Do Nothing Or Set Some Internal Flag 
} 
類)僅測試期間使用的

回答

1

沒有好辦法做到這一點。 Android工具框架真的是要單元測試一個Android組件。一旦控制傳出組件,其他一些框架必須接管。

也許你可以開始擴展數據,告訴活動發送電子郵件存根意圖,而不是一個真正的初始活性。真正的問題是沒有關閉電子郵件活動,它是嘲笑,這樣你就可以回到你期望的回報。不幸的是,Android組件不支持模擬。圍繞是最委託操作POJO的子類,然後嘲笑他們的方式。

+0

感謝你回答。我已經進行了單元測試組件,TDD-ing以及運行集成/功能測試。我所說的測試實際上是一項功能測試。 我知道你的第一個建議基本上是讓活動檢測到它在測試模式下運行,所以不要真正啓動電子郵件編輯器,而是從外部做一些其他測試。這可能是一種方式... – superjos

1

您可以創建在你的測試,以檢查正確的意圖的意圖過濾器被觸發,然後給出處理結果返回,或者你可以讓一個應用程序只是爲了測試這一點,例如處理該電子郵件的意圖和它設置爲系統默認的應用程序,這個程序實際上沒有GUI和自動返回你想要的結果,無論是在意圖硬編碼或基於文件的地方,你可以同時讀取或額外的信息,甚至。

下面是一個例子:

//set up the filter 
final Instrumentation inst = getInstrumentation(); 
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_VIEW); 
intentFilter.addDataScheme("http"); 
intentFilter.addCategory(Intent.CATEGORY_BROWSABLE); 

//Set up the monitor 
//THE BOOLEAN ON THE END TELLS THE SYTEM TO BLOCK IT FROM OCCURING, you probably want true here 
ActivityMonitor monitor = inst.addMonitor(intentFilter, null, true); 

assertEquals(0,monitor.getHits()); 

//click the link here with whatever framework you are using 
solo. clickOnText("link text") 

//Wait for the activity to get hit 
monitor.waitForActivityWithTimeout(2000); 

//Here is where you actually check it happened 
assertEquals(1, monitor.getHits()); 
inst.removeMonitor(monitor); 
+0

謝謝。在我的情況下,我不想從外部應用程序/活動返回任何結果。 我應該創建一個完整的應用程序(即使很簡單),僅用於測試目的,根據我的說法(已經有3個僅用於測試的項目:單元,集成,功能)有點太過分了。此外,我不喜歡手動將此應用程序設置爲默認電子郵件。我寧願保持測試環境儘可能簡單和自動化。 – superjos

+0

如果你不想要任何東西,那麼你應該在儀器測試中創建一個意圖過濾器。這就像六行代碼,並且不必在實際的應用程序中輸入大量無用的代碼。 –

+0

uhm。但是,我想我應該手動進入設備並將該儀器應用程序設置爲電子郵件意圖的默認「處理程序」,否則我想在測試期間出現一個彈出窗口,詢問我是否要打開電子郵件應用程序或我的入侵應用程序。 是嗎? – superjos