Я работаю над приложением с экраном настроек, который я хочу протестировать с помощью эспрессо. В этот экран настроек я добавить PreferenceFragment так:Тестирование предпочтенияFragment не работает с Espresso и JUnit-Rules или ActivityInstrumentationTestCase2
setContentView(R.layout.settings_activity);
...
getFragmentManager().beginTransaction().replace(R.id.content_frame, new V4SettingsFragment()).commit();
settings_activity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/toolbar" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@id/content_frame"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="4dp"
android:id="@+id/shadow_prelollipop"
android:background="@drawable/shadow_toolbar" />
</FrameLayout>
Этот экран настроек отлично работает, когда я использую его в обычном порядке, но что-то получает странно, когда я пытаюсь проверить и изменить настройки в тесте эспрессо.
AndroidJUnit4 тест
@Rule
public ActivityTestRule<V4SettingsActivity> settingsActivity = new ActivityTestRule<>(V4SettingsActivity.class);
@Test
public void checkFragement(){
Resources resources = settingsActivity.getActivity().getResources();
Matcher<View> adapterMatcher = allOf(isDescendantOfA(withId(R.id.content_frame)), withId(android.R.id.list));
onData(allOf(
is(instanceOf(Preference.class)),
withKey(resources.getString(R.string.prefs_category_display_preferredviewer))))
.inAdapterView(adapterMatcher);
}
Это ошибка, я получаю от Espresso:
....CustomFailureHandler$NoHierarchyException: android.support.test.espresso.AmbiguousViewMatcherException: Multiple Ambiguous Views found for matcher (is descendant of a: with id: ....:id/content_frame and with id: android:id/list)
Так я исследовал дальше и выяснили, что расположение моей странице настроек выглядит иначе, когда я использую приложение, и когда я использую его в тесте Espresso. Обычно внутри LinearLayout с id content_frame есть только один ребенок (у которого есть id android: id/list. Но когда я запускаю тест Espresso, я вижу, что тот же вид LinearLayout содержит 2 дочерних элемента.
Когда я запускаю следующий код внутри теста эспрессо:
ViewGroup viewById = (ViewGroup) settingsActivity.getActivity().findViewById(R.id.content_frame);
for(int i=0; i<viewById.getChildCount(); i++){
ViewGroup vgChild = (ViewGroup) viewById.getChildAt(i);
Log.d(TAG, "switchDirectToHtmlReader() " + vgChild.toString()); // called two times during espresso test
}
я получаю следующий вывод:
D: switchDirectToHtmlReader() android.widget.ListView{2854b6d9 V.ED.VC. ......ID 0,0-1080,0 #102000a android:id/list}
D: switchDirectToHtmlReader() android.widget.LinearLayout{37eb976a V.E..... ........ 0,0-1080,1677}
но когда я запускаю аналогичный код не в тесте эспрессо, но в своей деятельности я получаю следующий вывод:
D: onCreate() android.widget.ListView{149b8a90 V.ED.VC. ......I. 0,0-0,0 #102000a android:id/list}
Так что вместо одного ребенка с id android: id/list, который я получаю, когда я обычно использую приложение, я получаю два дочерних элемента, когда запускаю тест эспрессо.
Что я делаю неправильно, почему иерархия выглядит так отличной от иерархии в обычном использовании?