Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Espresso NoMatchingViewException when using withId matcher

I'm trying to write a simple test where I simply click on a MenuItem that is in the main activity:

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());
  }

}

The test fails with "NoMatchingViewException". If I change the onView line to:

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

Here is the menu xml for the activity:

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

The test works. Why would the matcher withText find the view whereas the matcher withId not find?

like image 672
Omar Avatar asked Jul 14 '14 13:07

Omar


2 Answers

haffax's answer is right. The menu item and the View generated for the menu have different IDs. Using withText is the best known practice in this case.

To avoid hardcoding a text like 'Add new' in your test, I would recommmand using a String reference. E.g.,

<item
    android:id="@+id/create_new"
    android:title="@string/action_create_new"
    tools:ignore="HardcodedText"
/>
like image 28
lacton Avatar answered Nov 06 '22 10:11

lacton


Yes, this is how it works in Espresso. The problem here is, that in Android, the View representing the menu item doesn't have the ID of the menu item. So onView(withId(X)) just fails to find a View. I don't have a better recommendation than just using withText(). If you have multiple views with the same text, using hierarchy for distinction works.

like image 181
haffax Avatar answered Nov 06 '22 11:11

haffax