如何用Espresso测试由TaskStackBuilder生成的PendingIntent



我正在我们的应用程序中开发一些很酷的推送通知,并进行一些测试,以覆盖当用户点击其中一个通知时,应用程序启动正确的意图来打开正确的活动。

在我们的应用程序中,我们有一个StartupActivity,它捕获所有这些推送通知,并使用正确的附加功能路由到正确的屏幕。使用Espresso完成的UI测试,包含正确的启动,如下所示:

    @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)));
    }

正如你所看到的,这个测试模拟了接收一个通知,点击它并检查是否抛出了指向正确Activity的Intent。

当我们有一个屏幕不在第一层时,问题就来了,例如典型的细节屏幕,我们需要构建一个活动堆栈。为此,我们使用TaskStackBuilder来生成一个PendingIntent和所有的intent堆栈。一个示例代码,根据最终Activity的意图生成堆栈:

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 espresso方法永远不会验证这个Pending Intent并且测试永远不会通过。如果我将挂起的意图更改为正常和直接的意图,则测试通过。因此,我们可以假设方法intended()不能捕获挂起的意图。

是否有任何形式来测试挂起的意图?

Espresso Intents是密封测试的解决方案。当你通过intent与其他应用程序通信时,它可以让你用Espresso进行测试。

既然你在你的应用程序的边界内,考虑通过验证正确的屏幕显示在每个导航步骤来测试你的UI。如何从一个屏幕切换到另一个屏幕是一个实现细节。点击通知>验证标题是否显示>按回车键>验证列表是否显示

最新更新