32

在 Robolectric 中模拟按钮点击相当简单:

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

但是,我似乎无法弄清楚如何对菜单项做同样的事情。我在 中创建了一个菜单Activity.onCreateOptionsMenu,如何模拟单击其中一项?

4

6 回答 6

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

享受!

于 2011-12-21T05:46:28.353 回答
18

在 Robolectric 3.0+ 中,您可以使用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()));
于 2015-04-08T00:11:45.633 回答
12

在 robolectric 3.0+ 中,该类被称为RoboMenuItem

于 2015-04-01T14:28:13.193 回答
2

您已经在使用 Robolectric 那么为什么不使用RoboMenuItem呢?

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

根据需要添加尽可能多的项目。

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

确保您的活动不为空

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

电动版4.3

于 2019-09-21T17:33:38.963 回答
1

使用 robolectric 2.4:

Activity activity = Robolectric.buildActivity(MainActivity.class).create().get();
MenuItem item = new TestMenuItem(R.id.settings_option_item);
activity.onOptionsItemSelected(item);
于 2014-12-22T19:30:08.270 回答
0

如果您想减少所需的覆盖/抽象编码的数量,您也可以使用 Mockito。像这样(在 Kotlin 中):

val menuItem = mock(MenuItem::class.java)
`when`(menuItem.itemId).thenReturn(R.id.itemId)
activity.onOptionsItemSelected(menuItem)
于 2018-05-30T01:29:06.293 回答