Android 浓缩咖啡:检查是否选择了NavigationDrawer列表项

Android 浓缩咖啡:检查是否选择了NavigationDrawer列表项,android,navigation-drawer,android-testing,android-espresso,Android,Navigation Drawer,Android Testing,Android Espresso,我有一个带有导航抽屉的应用程序。我想测试是否使用Espresso在NavigationDrawer的列表中选择了正确的项目 我找到了一种在列表视图中单击项目的方法。我使用相同的方法来测试列表项是否被选中。但这种行为很奇怪:第一次打电话似乎有效,但第二次打电话则无效。你知道这是什么原因吗,或者我怎样才能做得更好 我试过这个: // Open drawer. openDrawer(DRAWER_LAYOUT_ID); // We expect that the first item (map ov

我有一个带有
导航抽屉的应用程序。我想测试是否使用Espresso在NavigationDrawer的列表中选择了正确的项目

我找到了一种在列表视图中单击项目的方法。我使用相同的方法来测试列表项是否被选中。但这种行为很奇怪:第一次打电话似乎有效,但第二次打电话则无效。你知道这是什么原因吗,或者我怎样才能做得更好

我试过这个:

// Open drawer.
openDrawer(DRAWER_LAYOUT_ID);

// We expect that the first item (map overview) is selected.
// Here it works fine. The check succeeds.
String mapOverviewTitle = mActivity.getString(R.string.map_overview);
onView(allOf(withId(R.id.title), hasSibling(withText(mapOverviewTitle))))
        .check(matches(isSelected()));

// Navigate to the login fragment. This works fine too.
openDrawer(DRAWER_LAYOUT_ID);
String loginTitle = mActivity.getString(R.string.login);
onView(allOf(withId(R.id.title), hasSibling(withText(loginTitle))))
        .perform(click());

// We expect that the login item is selected. 
openDrawer(DRAWER_LAYOUT_ID);
// This does not work. The check fails.
onView(allOf(withId(R.id.title), hasSibling(withText(loginTitle))))
        .check(matches(isSelected()));
closeDrawer(DRAWER_LAYOUT_ID);
我从第二次呼叫中收到的错误消息如下:

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'is selected' doesn't match the selected view.
Expected: is selected
Got: "AppCompatTextView{id=2131558468, res-name=title, visibility=VISIBLE, width=240, height=48, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=72.0, y=8.0, text=Login, input-type=0, ime-target=false, has-links=false}"

看起来您需要构建一个自定义视图匹配器。您可以在这里查看
inRoot()
方法的示例,该方法可以让您选择与哪个窗口层进行交互。您的测试当前正在与最顶层的textView交互,您希望在此之前与第一层交互,并确保您的更改已启动


为什么不通过如下方法执行代码:

public void onNavigationDrawerItemSelected(int position) {
    Fragment frag = Dialer.newInstance("uselessParam1", "uselessParam2");
    switch (position){
        case 0:
            //code
            break;
        case 2:
            //code
            break;
        case 3:
            //code
            break;
    }
}

您只需查看哪个值与所需的列表项匹配即可。

在我的示例中,我是这样做的:

String fragmentTitle = mInstrumentation.getTargetContext().getString(TITLE_STRING_ID);
openDrawer(DRAWER_LAYOUT_ID);
onView(withText(fragmentTitle)).perform(click());
onView(withId(R.id.toolbar_title)).check(matches(withText(fragmentTitle)));

如果您有一个包含textview toolbartitle的工具栏,您可以这样检查它

看起来您正在尝试将isSelected()与字符串匹配,而不是与单选复选框匹配。尝试将最后一步更改为onView(allOf(withId(R.id.checkbox_id)、hasSibling(withText(loginTitle))))。检查(matches(isSelected());好吧,也许我完全误解了
isSelected()
的目的。我想检查的是,是否选择了列表项,比如用户点击它,然后背景颜色不同,表示选择。没有复选框。你能详细说明我需要为我发布的代码做什么吗?不确定您的意思…这将检查工具栏标题是否与片段标题匹配。这与我的问题完全无关。在我的情况下,当选择一个并加载片段时,工具栏的标题将更改,因此这将是一个解决方法,可以知道选择了什么。我想如何使用浓缩咖啡进行测试,而不是将另一个回调方法添加到我的导航抽屉中。@Terry oh ok。我希望你将来能找到解决办法。