Android 如何使用Espresso测试NavigationView菜单项是否已禁用或启用?

Android 如何使用Espresso测试NavigationView菜单项是否已禁用或启用?,android,android-espresso,navigationview,android-navigationview,Android,Android Espresso,Navigationview,Android Navigationview,我有一个NavigationView,其中有一个菜单,当用户未登录时,某些菜单项应被禁用: private void setupNavigationViewMenu(boolean isUserLoggedIn) { Menu menu = mNavigationView.getMenu(); menu.findItem(R.id.item_charge_cards).setEnabled(isUserLoggedIn); menu.findItem(R.id.item_

我有一个
NavigationView
,其中有一个菜单,当用户未登录时,某些菜单项应被禁用:

private void setupNavigationViewMenu(boolean isUserLoggedIn) {
    Menu menu = mNavigationView.getMenu();
    menu.findItem(R.id.item_charge_cards).setEnabled(isUserLoggedIn);
    menu.findItem(R.id.item_charge_sessions).setEnabled(isUserLoggedIn);
    menu.findItem(R.id.item_invoices).setEnabled(isUserLoggedIn);
}
我想创建一个浓缩咖啡测试,它将断言菜单项确实被禁用

我已经写了以下测试,但没有通过:

@Test
public void navigationMenuItems_AreDisabled() {
    openNavigationDrawer();
    onView(getNavigationItemWithString(R.string.navigation_view_item_charging_cards))
            .check(matches(not(isEnabled())));
    onView(getNavigationItemWithString(R.string.navigation_view_item_charging_sessions))
            .check(matches(not(isEnabled())));
    onView(getNavigationItemWithString(R.string.navigation_view_item_invoices))
            .check(matches(not(isEnabled())));
}

public static Matcher<View> getNavigationItemWithString(String string) {
    return allOf(isAssignableFrom(AppCompatCheckedTextView.class), withText(string));
}

您对如何编写正确的测试有什么建议吗?

一个
NavigationView
菜单项不是一个单一的视图,而是一个视图组,因此启用状态应用于
NavigationMenuItemView
,而不是
AppCompatCheckedTextView
。为了修复测试,必须使用以下匹配器在视图层次结构中找到正确的布局:

public static Matcher<View> getNavigationItemWithString(String string) {
    Matcher<View> childMatcher = allOf(isAssignableFrom(AppCompatCheckedTextView.class), withText(string));
    return allOf(isAssignableFrom(NavigationMenuItemView.class), withChild(childMatcher));
}
公共静态匹配器getNavigationItemWithString(字符串){
Matcher childMatcher=allOf(isAssignableFrom(AppCompatCheckedTextView.class),带文本(字符串));
返回allOf(isAssignableFrom(NavigationMenuItemView.class),withChild(childMatcher));
}
public static Matcher<View> getNavigationItemWithString(String string) {
    Matcher<View> childMatcher = allOf(isAssignableFrom(AppCompatCheckedTextView.class), withText(string));
    return allOf(isAssignableFrom(NavigationMenuItemView.class), withChild(childMatcher));
}