4

我在我們的應用程序中開發了一些很酷的推送通知,並進行了一些測試,以便當用戶點擊其中一個通知時,應用程序啓動正確的意圖打開正確的活動。如何用Espresso測試由TaskStackBuilder生成的PendingIntent

在我們的應用程序中,我們有一個StartupActivity,它捕獲所有這些推送通知並將其路由到正確的屏幕並顯示正確的附加內容。 的UI測試,與Espresso完成,覆蓋了正確的推出看起來是這樣的:

@Test 
    public void showsANotificationAndOpensTheCorrectScreen() throws 
      UiObjectNotFoundException { 
     sendBroadcast(PushNotificationBuilder 
       .withAction("com.xxxx.android.gcm.SOMETHING") 
       .withType("SOME_TYPE") 
       .withRelatedId(ANY_ID) 
       .withTitle(ANY_TITLE) 
       .build()); 

     tapNotificationWithTitle(ANY_TITLE); 

     intended(allOf(
       hasComponent(DesitinyActivity.class.getCanonicalName()), 
       hasExtra("extra_id", Long.valueOf(ANY_ID)), 
       hasExtra("extra_other_extra", true))); 
    } 

正如你所看到的,這個測試模擬收到一個通知,它並檢查挖掘如果打算到正確的活動是拋出。

當我們有一個不在第一級的屏幕時(例如典型的細節屏幕),我們需要構建一堆活動,問題就會到來。爲此,我們使用TaskStackBuilder來生成包含所有意向堆棧的PendingIntent。一個示例代碼生成給定的最終活動的意圖的堆棧:

private PendingIntent generateexampleTaskBuilder(Context context, Intent intentToTheFinalScreen) { 
     TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
     stackBuilder.addNextIntent(ExampleActivity.getLaunchIntent(someExtra, context)); 
     stackBuilder.addNextIntent(intent); 
     return stackBuilder.getPendingIntent(PushIdIntegerGenerator.getUniquePushId(), 
       PendingIntent.FLAG_UPDATE_CURRENT); 
    } 

的問題是,該濃咖啡intended方法從未驗證了該待定意圖和測試從未通過。如果我改變了正常和直接意圖的未決意圖,測試通過。所以我們可以假設意圖的方法()不能捕獲未決的意圖。

是否有任何形式來測試待處理的意圖?

+1

以防萬一有人來這裏尋找如何使用打算TaskStackBuilder存根。您需要通過堆棧層次結構存儲所有活動意圖。 – Milan

回答

4

Espresso Intents是一種密封測試解決方案。當您通過Intents與其他應用進行交流時,它可以讓您使用Espresso進行測試。

由於您處於應用程序邊界內,因此請考慮通過驗證每個導航步驟中顯示的屏幕是否正確來測試您的用戶界面。從屏幕到屏幕的過程是一個實現細節。點按通知>顯示驗證標題>按回>顯示驗證列表。