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

How to test with Espresso a PendingIntent generated by TaskStackBuilder

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

在我们的应用程序中,我们有一个 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。 示例 代码,根据最终 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 是密封测试的解决方案。当您通过 Intents 与其他应用程序通信时,它可以让您使用 Espresso 进行测试。

由于您停留在应用的范围内,请考虑通过验证每个导航步骤中显示的屏幕是否正确来测试您的 UI。如何从一个屏幕转到另一个屏幕是一个实现细节。点击通知 > 确认显示标题 > 按返回 > 确认列表显示。