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进行测试。

由于您处于应用程序边界内,因此请考虑通过验证每个导航步骤中显示的屏幕是否正确来测试您的用户界面。从屏幕到屏幕的过程是一个实现细节。点按通知>显示验证标题>按回>显示验证列表。