测试PreferenceFragment不适用于Espresso和JUnit-Rules或ActivityInstrum



我正在开发一个带有设置屏幕的应用程序,我想用浓缩咖啡测试一下。在这个设置屏幕中,我添加了一个PreferenceFragment,如下所示:

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测试中使用它。通常在id为content_frame的LinearLayout中只有一个子(id为android:id/list)。但是当我运行Espresso测试时,我看到相同的LinearLayout视图包含2个子视图。

当我在Espresso测试中运行以下代码时:

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}

但是当我运行类似的代码不是在espresso测试中,而是在活动中,我得到以下输出:

D: onCreate() android.widget.ListView{149b8a90 V.ED.VC. ......I. 0,0-0,0 #102000a android:id/list}

所以当我正常使用应用程序时,我只得到一个id为android:id/list的孩子,当我运行espresso测试时,我得到两个孩子。

我做错了什么,为什么层次结构看起来和正常使用的层次结构如此不同?

我真的不明白,但这解决了我的问题:如果我添加以下行

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。(就像我通常使用应用程序时一样),我的浓缩测试工作得很好。

相关内容

  • 没有找到相关文章

最新更新