Как проверить заголовок панели инструментов в андроид-инструментальном тесте?

Я нашел отличное инструментальное руководство по тестированию YT Advanced Android Espresso. Я взял код оттуда с небольшим изменением моих потребностей.

import static android.support.test.InstrumentationRegistry.getInstrumentation;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withChild;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withParent;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.core.AllOf.allOf;

...

@Test
public void checkToolbarTitle() {
    String toolbarTitile = getInstrumentation().getTargetContext().getString(R.string.my_bus_stops);
    onView(allOf(isAssignableFrom(TextView.class), withParent(isAssignableFrom(Toolbar.class)))).check(matches(withText(toolbarTitile)));
}

К сожалению, это не работает для меня. Тест не пройден с:

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: (is assignable from class: class android.widget.TextView and has parent matching: is assignable from class: class android.widget.Toolbar)

Что с этим не так? Как я могу проверить это по-другому?

Ответ 1

РЕШЕНИЕ

Метод в порядке. Как Чиу-Ки Чан написала в своем уроке, вы можете "точно определить эту конкретную точку зрения". НО вы должны убедиться, что импортировали правильную панель инструментов:

import  android.support.v7.widget.Toolbar;

вместо:

import android.widget.Toolbar;

Ответ 2

Это работает для меня:

onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar))))
    .check(matches(withText("toolbarTitile")));

Ответ 3

Если вы используете ActionBar, а не панель инструментов, используйте это:

onView(allOf(instanceOf(TextView.class), 
     withParent(withResourceName("action_bar"))))
        .check(matches(withText("My ActionBar title")));

Примечание: чтобы быстро добавить импорт для этих методов, поместите мигающий курсор на неразрешенный метод, а затем выполните команду Android Studio ➔ Справка ➔ Найти действие ➔ найдите "show intention action" ➔ щелкните параметр результата ➔ Появится всплывающее окно ➔ нажмите на "Import static method ...". Вы также можете назначить сочетание клавиш для "Показать намеренные действия". Подробнее здесь. Другой способ - включить "Add unambiguous imports on the fly" в настройках.

Ответ 4

Я не помню, писал ли я сам, или нашел его где-то, но вот как я проверяю заголовки панели инструментов:

public static Matcher<View> withToolbarTitle(CharSequence title) {
    return withToolbarTitle(is(title));
}

public static Matcher<View> withToolbarTitle(final Matcher<CharSequence> textMatcher) {
    return new BoundedMatcher<View, Toolbar>(Toolbar.class) {
        @Override
        public boolean matchesSafely(Toolbar toolbar) {
            return textMatcher.matches(toolbar.getTitle());
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("with toolbar title: ");
            textMatcher.describeTo(description);
        }
    };
}

Это работает со всеми случаями. Пример утверждения: onView(withId(R.id.toolbar)).check(matches(withToolbarTitle("title")));