android - 在多项 Activity 中使用 Espresso 空闲资源

标签 android android-espresso

我有一个启动 secondActivity 的 firstActivity,在 secondActivity 中我有一个加载对话框(不是 AsyncTask),我需要让 Espresso 等到对话框消失,然后才能继续测试。
我必须在哪里实现 IdlingResource?如何让它等待 dismissDialog() 函数?

这是我尝试做的:

  class DocumentLoadingIdlingResource implements IdlingResource {
    private ResourceCallback callback;

    @Override
    public String getName() {
      return "Documnet loading idling resource";
    }

    @Override
    public boolean isIdleNow() {
      Activity activity;
      try {
        activity = getCurrentActivity();
      } catch (Throwable e) {
        return false;
      }

      if(activity.getClass().getName().equals(EditorActivity.class.getName())
            && activity.loadingDialogShowing() == false) {
        return false;
      }

      return true;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback callback) {
      this.callback = callback;
    }
  }

  Activity getCurrentActivity() throws Throwable {
    getInstrumentation().waitForIdleSync();
    final Activity[] activity = new Activity[1];
    runTestOnUiThread(new Runnable() {
      @Override
      public void run() {
        java.util.Collection<Activity> activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
        activity[0] = com.google.common.collect.Iterables.getOnlyElement(activites);
    }});
    return activity[0];
  }

该类在测试类中实现。

最佳答案

这里有几个问题:

  1. 您的 isIdleNow() 调用 getCurrentActivity(),后者调用 waitForIdleSync() 和 runTestOnUiThread()。 isIdleNow Javadoc 说:“Espresso 将总是从主线程调用此方法,因此它应该是非阻塞的并立即返回。”所以这不会按原样工作,但您可以直接从 isIdleNow 调用 getActivitiesInStage。
  2. 您的另一个问题是您存储了对 ResourceCallback 的引用但从不调用 onTransitionToIdle,您还应该考虑到注册多个 ResourceCallback 的可能性并在所有回调上调用 onTransitionToIdle。

您可以执行以下操作:

  1. 复制/粘贴 IdlingResource作为 com.mycompany.IdlingResource 进入您的应用
  2. 然后让您的 Activity 实现该接口(interface),并确保在对话框消失时调用 onTransitionToIdle,并确保 isIdleNow 在对话框显示时返回 false。
  3. 在您的测试代码中,编写一个包装 com.mycompany.IdlingResource 的“IdlingResourceAdapter”并将其转换为 Espresso IdlingResource 并向 Espresso 注册。

一旦这个问题得到实现,这将变得更简单:https://code.google.com/p/android-test-kit/issues/detail?id=71

关于android - 在多项 Activity 中使用 Espresso 空闲资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25470210/

相关文章:

android - 卸载应用程序时删除接近警报

android - 将默认 Locale 设置为 DatePicker 和 TimePicker

android - 钛合金中的 SQLite 更新查询

java - 没有注册仪器,运行单元测试时出错

java - Android/Java 重复按钮点击

java - 类转换异常 : BitmapDrawable cannot be cast to LayerDrawable

java - 由于 Android 消息 `Viewing full screen, To exit, swipe down from the top`,Espresso 测试失败

android - Espresso - 检查 RecyclerView 商品的订购是否正确

android - 如何在Android中测试基于Espresso的Intent?

android - 如何在 Android Espresso 中调用其他测试类?