futlib
futlib

Reputation: 8408

Simulating a click on a menu item in Robolectric

It's fairly simple to simulate a button click in Robolectric:

Button someButton = (Button) findViewById(R.id.some_button);
someButton.performClick();

However, I can't seem to figure out how to do the same thing with a menu item. I create a menu in Activity.onCreateOptionsMenu, how can I simulate a click on one of its items?

Upvotes: 35

Views: 11247

Answers (6)

Aks4125
Aks4125

Reputation: 5720

You are already using Robolectric then why don't use RoboMenuItem ?

private MenuItem menuItemName = new RoboMenuItem(R.id.action_names);
private MenuItem menuItemStar = new RoboMenuItem(R.id.action_stars);

add as many items as required.

@Test
public void onOptionItemSelectedTest() {
    activity.onOptionsItemSelected(menuItemStar);
    activity.onOptionsItemSelected(menuItemName);
}

Make sure your activity is not null

 @Before
public void setUp() {
    activity = Robolectric.buildActivity(MainActivity.class)
            .create(new Bundle())
            .saveInstanceState(new Bundle())
            .restoreInstanceState(new Bundle())
            .resume()
            .get();
}

Robolectric version 4.3

Upvotes: 2

Kevin VanDenBreemen
Kevin VanDenBreemen

Reputation: 159

You can also use Mockito if you'd like to cut down on the amount of overriding/abstract coding required. Like this (in Kotlin):

val menuItem = mock(MenuItem::class.java)
`when`(menuItem.itemId).thenReturn(R.id.itemId)
activity.onOptionsItemSelected(menuItem)

Upvotes: 0

hidro
hidro

Reputation: 12541

In Robolectric 3.0+, you can use ShadowActivity.clickMenuItem(menuItemResId):

        // Get shadow
    ShadowActivity shadowActivity = Shadows.shadowOf(activity);

    // Click menu
    shadowActivity.clickMenuItem(R.id.settings_option_item);

    // Get intent
    Intent startedIntent = shadowActivity.getNextStartedActivity();
    ShadowIntent shadowIntent = Shadows.shadowOf(startedIntent);

// Make your assertion
assertThat(shadowIntent.getComponent().getClassName(), equalTo(HelloActivity_.class.getName()));

Upvotes: 19

karlicoss
karlicoss

Reputation: 2549

In robolectric 3.0+ the class is called RoboMenuItem

Upvotes: 12

karma
karma

Reputation: 1298

Using robolectric 2.4:

Activity activity = Robolectric.buildActivity(MainActivity.class).create().get();
MenuItem item = new TestMenuItem(R.id.settings_option_item);
activity.onOptionsItemSelected(item);

Upvotes: 1

lemon
lemon

Reputation: 9205

MenuItem item = new TestMenuItem() {
  public int getItemId() {
    return R.id.hello;
  }
};

activity.onOptionsItemSelected(item);

ShadowActivity shadowActivity = Robolectric.shadowOf(activity);
Intent startedIntent = shadowActivity.getNextStartedActivity();
ShadowIntent shadowIntent = Robolectric.shadowOf(startedIntent);

assertThat(shadowIntent.getComponent().getClassName(), equalTo(HelloActivity_.class.getName()));

Enjoy!

Upvotes: 32

Related Questions