我有一个启动 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];
}
该类在测试类中实现。
最佳答案
这里有几个问题:
- 您的 isIdleNow() 调用 getCurrentActivity(),后者调用 waitForIdleSync() 和 runTestOnUiThread()。 isIdleNow Javadoc 说:“Espresso 将总是从主线程调用此方法,因此它应该是非阻塞的并立即返回。”所以这不会按原样工作,但您可以直接从 isIdleNow 调用 getActivitiesInStage。
- 您的另一个问题是您存储了对 ResourceCallback 的引用但从不调用 onTransitionToIdle,您还应该考虑到注册多个 ResourceCallback 的可能性并在所有回调上调用 onTransitionToIdle。
您可以执行以下操作:
- 复制/粘贴 IdlingResource作为 com.mycompany.IdlingResource 进入您的应用。
- 然后让您的 Activity 实现该接口(interface),并确保在对话框消失时调用 onTransitionToIdle,并确保 isIdleNow 在对话框显示时返回 false。
- 在您的测试代码中,编写一个包装 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/