我有一个需要打开android.support.v7.preference的测试。列表首选项对话框,选择一个选项,打开导航抽屉并从抽屉中选择一个项目。
对话框定义如下:
<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测试?
如果你还没有找到一个解决方案,这里提供的一个可能会帮助你。
使用idlerresource等待视图变为可见
解决方案是实现IdlingResource
,它将允许您提供一个回调,以便在一切都空闲时立即运行。
@Override
public final boolean isIdleNow() {
mIdle = mIdle || mView.getVisibility() == mExpectedVisibility;
if (mIdle) {
if (mResourceCallback != null) {
mResourceCallback.onTransitionToIdle();
}
}
return mIdle;
}