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

Ara*_*cem 5 testing android android-intent android-pendingintent android-espresso

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

在我们的应用程序中,我们有一个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)));
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,此测试模拟接收通知,点击它并检查是否抛出了对正确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);
    }
Run Code Online (Sandbox Code Playgroud)

问题是intendedespresso方法永远不会验证此Pending Intent并且测试永远不会通过.如果我更改了正常和直接Intent的待定意图,则测试通过.因此我们可以假设方法intent()无法捕获挂起的意图.

是否有任何形式来测试待定意图?

Jos*_*eca 5

Espresso Intents是密封测试的解决方案.当您通过Intents与其他应用程序通信时,它允许您使用Espresso进行测试.

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