2010-10-28 91 views
33

我有一個在Android中發送狀態欄通知的類。我找不到一種方法來測試通知是否已發送,這使得編寫任何有用的單元測試非常困難。我可以使用Android的測試框架測試狀態欄通知嗎?

有沒有人有解決方案?

+0

有一個名爲robotium的測試框架,但我不知道它是否支持通知。但是如果標準的junit lib不支持它,你可以檢查一下。 http://code.google.com/p/robotium/ – 2010-10-28 17:23:15

回答

5

也許不是你要找的,但像往常一樣的解決方案是將答案:

  • 創建一個接口抽象的通知功能。
  • 創建委派給系統通知API的默認實現。
  • 運行測試時,用支持測試的模擬實現替換(或修飾)默認實現。

這可以用下面的技術被簡化:

  • 依賴注入框架(如RoboGuice),以簡化實施的選擇。
  • 模擬庫(如EasyMock)自動創建模擬實現。
1

解決了類似的情況,通過在數據存儲中存儲通知詳細信息,然後每當用戶通過通知欄進入應用程序時發送和標記爲已確認。 由於robotium僅限於應用程序邊界,因此無法訪問系統數據,因此使用基於junit/jmockit的單元測試來測試行爲。

4

嘗試通過擴展NotificationManager並覆蓋notify()方法來創建模擬對象。重寫的函數可以被聲明。在您的測試用例中,將模擬注入主題活動並使用Android JUnit Test運行測試。

2

UI Testing

這是你想要什麼,我想。 uiautomator。

僅適用於Android 4.1或以上版本。您需要先運行示例代碼。

你可以寫一段代碼來執行下拉狀態欄動作,然後做你的事情。這只是UI測試。您無法使用uiautomator測試您的數據。

希望這會有所幫助。

-1

只是爲了節省其他人一些時間:看起來應該檢測到通知,但是沒有,正試圖用NO_CREATE標誌創建一個PendingIntent。

由於嘗試使用與現有通知相同的值創建PendingIntent,但使用NO_CREATE標誌,應該返回null,它似乎會告知通知是否已有一個。

不幸的是,這似乎並不可靠。

1

您可以使用模擬器,只爲這些類型的測試中,採用Android棉花糖(API 23)。

例如:

public void testCheckNotification_2() throws IOException, InterruptedException, GcmException 
{ 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     GcmResponse gcmResponse = endPointImp.sendGcmMulticastRequestImp(getGcmMultiRequest()); 
     assertThat(gcmResponse.getSuccess(), is(1)); 
     Thread.sleep(2000); 
     assertThat(mManager.getActiveNotifications().length, is(1)); 
     StatusBarNotification barNotification = mManager.getActiveNotifications()[0]; 
     assertThat(barNotification.getId(), is(INCIDENCIA.getTitleRsc())); 

     // We check the pending intent. 
     PendingIntent pendingIntent = barNotification.getNotification().contentIntent; 
     assertThat(pendingIntent.getCreatorPackage(), is(GcmRequest.PACKAGE_DIDEKINDROID)); 
    } 
} 

重要的部分是在調用NotificationManager(mManager的),以檢查它是否具有發送多播消息到谷歌FCM HTTP端點後活性通知。

相關問題