Android Espresso不等待用户界面完成

时间:2016-08-16 20:19:11

标签: android android-testing android-espresso

我有一个需要打开android.support.v7.preference.ListPreference对话框的测试,选择一个选项,打开NavDrawer并从抽屉中选择一个项目。

对话框的定义如下:

<android.support.v7.preference.ListPreference
    android:defaultValue="@string/pref_default_VALUE"
    android:entries="@array/pref_VALUE_entries"
    android:entryValues="@array/pref_VALUE_values"
    android:key="@string/pref_key_VALUE"
    android:negativeButtonText="@null"
    android:positiveButtonText="@null"
    android:title="@string/pref_title_VALUE" />

Espresso打开它:

onView(withText(mActivityRule.getActivity().getResources().getString(R.string.pref_title_VALUE))
    .perform(click());

这会打开ListPreference,但它不会阻塞,测试中的下一行会立即运行。

// click on setting
    onView(withText(VALUE_IN_LIST_PREFERENCE))
            .perform(click());

由于这种情况立即发生,因此没有出现对话框,并且withText(VALUE_IN_LIST_PREFERENCE)也没有匹配。

如果我单步执行调试器,暂停上面的行,对话框将及时显示,代码将起作用。

导航抽屉也会出现同样的问题。它是这样打开的:

// open the nav drawer
    onView(withId(R.id.drawer_layout))
            .perform(DrawerActions.open());

点击了一个项目:

// click on phase 1
    onView(withId(R.id.nav_view))
            .perform(NavigationViewActions.navigateTo(R.id.nav_ITEM));

与ListPreferences一样,测试代码继续而不等待UI完成,因此对onView的调用失败。

我已尝试将线程置于睡眠状态并按照https://stackoverflow.com/a/22563297/4950621

中的答案进行操作

然而,在这两种情况下,在线程完成休眠并且视图测试立即运行之前,对话框不会出现。所以,问题只是延迟,而不是解决。

如何在必要的视图可见之前确保不运行Espresso测试?

1 个答案:

答案 0 :(得分:0)

如果您还没有找到解决方案,此处提供的解决方案可能会帮助您解决问题。

Wait until view become visible with IdleResource

解决方案是实现IdlingResource,这将允许您在一切都变为空闲时提供回调。

@Override
public final boolean isIdleNow() {
    mIdle = mIdle || mView.getVisibility() == mExpectedVisibility;

    if (mIdle) {
        if (mResourceCallback != null) {
            mResourceCallback.onTransitionToIdle();
        }
    }

    return mIdle;
}