使用具有多个活动的Espresso空闲资源

Oma*_*mar 9 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];
  }
Run Code Online (Sandbox Code Playgroud)

该类在测试类中实现.

yog*_*arl 2

这里有几个问题:

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

您可以执行以下操作:

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

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