首页 > 解决方案 > 将 ActivityTestRule 用于 Espresso 测试中的多个活动

问题描述

我有一个测试,我想在 espresso 中工作以获取我的应用程序中的所有(100 多个)活动,并断言它们启动了一个 Intent 来启动一个对话活动。测试在列表中的第一个活动上完美运行(或者如果只有一个活动),但在第二个活动上失败,因为 espresso 试图将其转换为第一个活动。

我必须使用 ActivityTestRule 而不是直接从上下文启动活动,否则 Intendo 预期的断言不起作用。

大多数文档都显示 espresso 在每次测试中设置一个活动,这在我的情况下是不可能的,因为我正在动态加载活动列表。

Espresso 正在保存某种我不知道如何清除的内部状态。有谁知道如何在 for 循环中的断言之间清除它?

或者除了 ActivityTestRule 之外还有另一个没有内部状态的类也适用于预期?

这是我要测试的示例:

ActivityInfo[] activities =
    appContext
        .getPackageManager()
        .getPackageInfo(appContext.getPackageName(), PackageManager.GET_ACTIVITIES)
        .activities;

for (ActivityInfo activityInfo : activities) {
  String className = activityInfo.name;
  ActivityTestRule activityTestRule =
      new ActivityTestRule<>((Class<Activity>) Class.forName(className));
  Intent intent = new Intent()
      .setClassName(appContext, className)
      .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

  activityActivityTestRule.launchActivity(intent);

  intended(hasComponent(ExpectedDialogActivity.class.getName()));

  activityActivityTestRule.finishActivity();
}

标签: androidandroid-espresso

解决方案


推荐阅读