2016-08-23 5 views
1

Я работаю над приложением с экраном настроек, который я хочу протестировать с помощью эспрессо. В этот экран настроек я добавить 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, который я получаю, когда я обычно использую приложение, я получаю два дочерних элемента, когда запускаю тест эспрессо.

Что я делаю неправильно, почему иерархия выглядит так отличной от иерархии в обычном использовании?

ответ

1

я действительно не понимаю, но это решить мою проблему: если я добавить следующие строки

ViewGroup vgParent = (ViewGroup)findViewById(R.id.content_frame); 
vgParent.removeView(findViewById(android.R.id.list)); 

перед тем

getFragmentManager().beginTransaction().replace(R.id.content_frame, new V4SettingsFragment()).commit(); 

то у меня есть только один ребенок внутри R.id. content_frame во время теста эспрессо (точно так же, как обычно я использую приложение), и мои тесты эспрессо работают нормально.

 Смежные вопросы

  • Нет связанных вопросов^_^