问题描述
我正在尝试为设置"中的PreferenceFragments片段编写测试.
I am trying to write tests for the PreferenceFragments fragment in Settings.
但是,我一直收到此错误:android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: is assignable from class: class android.widget.AdapterView
However, I've been getting this error:android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: is assignable from class: class android.widget.AdapterView
测试代码如下:
@RunWith(AndroidJUnit4.class)
@SmallTest
public class SettingsFragmentTest {
@Rule
public ActivityTestRule<SettingsActivity> mActivityRule = new ActivityTestRule<>(
SettingsActivity.class);
@Test
public void preferredLocationShouldBeVisibleOnDisplay(){
mActivityRule.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
SettingsFragment settingsFragment = startSettingsFragment();
}
});
// This check passes correctly
onView(withId(R.id.weather_settings_fragment))
.check(matches(isCompletelyDisplayed()));
// This check gives me the NoMatchingViewException
onData(allOf(is(instanceOf(Preference.class)),
withKey("location")))
.check(matches(isCompletelyDisplayed()));
}
private SettingsFragment startSettingsFragment(){
SettingsActivity activity = mActivityRule.getActivity();
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
SettingsFragment settingsFragment = new SettingsFragment();
transaction.replace(R.id.weather_settings_fragment, settingsFragment, "settingsFragment");
transaction.commit();
return settingsFragment;
}
}
settings_activity布局如下:
The settings_activity layout looks as follows:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.example.android.sunshine.SettingsFragment"
android:id="@+id/weather_settings_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
首选项"屏幕的布局如下:
And the Preferences Screen layout is the following:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditTextPreference
android:defaultValue="@string/pref_location_default"
android:inputType="text"
android:key="@string/pref_location_key"
android:singleLine="true"
android:title="@string/pref_location_label" />
<ListPreference
android:defaultValue="@string/pref_units_metric"
android:entries="@array/pref_units_options"
android:entryValues="@array/pref_units_values"
android:key="@string/pref_units_key"
android:title="@string/pref_units_label" />
<CheckBoxPreference
android:defaultValue="@bool/show_notifications_by_default"
android:key="@string/pref_enable_notifications_key"
android:summaryOff="@string/pref_enable_notifications_false"
android:summaryOn="@string/pref_enable_notifications_true"
android:title="@string/pref_enable_notifications_label" />
</PreferenceScreen>
我无法在线找到有关如何测试PreferenceFragments的任何示例或信息.大多数信息与测试活动有关.
I haven't been able to find any examples or information online on how to test PreferenceFragments. Most of the information related to testing Activities.
推荐答案
PreferenceMatchers似乎仅适用于Android框架中的首选项类,而不适用于支持首选项库(com.android.support:preference-v14).由于后者内部使用了RecylerView,因此我可以通过使用espresso-contrib中的RecyclerViewActions来掌握首选项:
PreferenceMatchers seems to work only with the preference classes from the Android framework, but not with support preference library (com.android.support:preference-v14). Since the latter uses a RecylerView internally, I was able to get hold of the preference items by using RecyclerViewActions from espresso-contrib:
onView(withId(R.id.list))
.perform(RecyclerViewActions.actionOnItem(hasDescendant(withText(R.string.pref_manage_categories_title)),
click()));
这篇关于使用Espresso测试Android PreferenceFragment的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!