【发布时间】:2016-09-27 15:37:37
【问题描述】:
我正在我们的应用程序中开发一些很酷的推送通知并进行一些测试以涵盖当用户单击其中一个通知时应用程序启动正确的意图以打开正确的活动。
在我们的应用程序中,我们有一个 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 并且测试永远不会通过。如果我将挂起的意图更改为正常和直接的意图,则测试通过。所以我们可以假设方法 expected() 不能捕获待处理的意图。
是否有任何形式来测试待处理的意图?
【问题讨论】:
-
以防万一有人来这里寻找如何使用 TaskStackBuilder 的意图进行存根。您需要通过堆栈层次结构存根所有活动意图。
标签: android testing android-intent android-pendingintent android-espresso