我正在我们的应用程序中开发一些很酷的推送通知,并在用户点击其中一个通知时进行一些测试,然后应用启动正确的意图来打开正确的活动。
在我们的应用程序中,我们有一个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)));
}
如您所见,此测试模拟接收通知,点击它并检查是否抛出了对正确活动的意图。
当我们有一个不在第一级的屏幕时问题到来,例如典型的详细信息屏幕,我们需要构建一堆活动。为此,我们使用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
espresso方法永远不会验证此Pending Intent并且测试永远不会通过。如果我更改了正常和直接Intent的待定意图,则测试通过。因此,我们可以假设方法intent()无法捕获挂起的意图。
是否有任何表单可以测试待处理的意图?
答案 0 :(得分:5)
Espresso Intents是密封测试的解决方案。当您通过Intents与其他应用程序通信时,它允许您使用Espresso进行测试。
由于您处于应用程序的边界内,请考虑通过验证每个导航步骤中是否显示正确的屏幕来测试您的UI。如何从屏幕到屏幕是一个实现细节。点击通知>验证标题显示>按下>显示验证列表。