Исключение Espresso NoMatchingViewException при использовании withid matcher

Я пытаюсь написать простой тест, где я просто нажимаю на меню, которое находится в основной деятельности:

public class doTest extends ActivityInstrumentationTestCase2<doActivity> {

  public doTest() {
    super(doActivity.class);
  }

  @Override
  public void setUp() throws Exception {
    super.setUp();
    startActivity();

  }

  private void startActivity() {
    Intent intent = new Intent();
    setActivityIntent(intent);
    getActivity();
  }

  public void testOne() {
    Espresso.openContextualActionModeOverflowMenu();
    onView(withId(R.id.create_new)).perform(ViewActions.click());
  }

}

тест завершается с ошибкой "NoMatchingViewException". Если я изменю строку onView на:

    onView(withText("Add new")).perform(ViewActions.click());

вот меню xml для деятельности:

 <item
        android:id="@+id/create_new"
        android:title="Add new"
        tools:ignore="HardcodedText">
    </item>

тест работает. Почему matcher withText находит представление, тогда как matcher withId не находит?

2 ответов


да, так это работает в эспрессо. Проблема здесь в том, что в Android представление, представляющее элемент меню, не имеет идентификатора элемента меню. Так что onView(withId(X)) просто не удается найти вид. У меня нет лучшей рекомендации, чем просто использовать withText(). Если у вас несколько представлений с одним и тем же текстом, использование иерархии для различения работает.


ответ хаффакса правильный. Элемент меню и вид, созданный для меню, имеют разные идентификаторы. Используя withText является наиболее известной практикой в этом случае.

чтобы избежать хардкодить текст 'добавить новый' в ваш тест, я бы recommmand используя строку ссылку. Е. Г.,

<item
    android:id="@+id/create_new"
    android:title="@string/action_create_new"
    tools:ignore="HardcodedText"
/>