Подтвердить что ты не робот

Имитация щелчка по пункту меню в Robolectric

Довольно просто имитировать нажатие кнопки в Robolectric:

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

Однако я не могу понять, как сделать то же самое с элементом меню. Я создаю меню в Activity.onCreateOptionsMenu, как я могу имитировать щелчок на одном из своих элементов?

4b9b3361

Ответ 1

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

Наслаждайтесь!

Ответ 2

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

Ответ 3

В robolectric 3.0+ класс называется RoboMenuItem

Ответ 4

Использование robolectric 2.4:

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

Ответ 5

Вы также можете использовать Mockito, если вы хотите сократить объем требуемого переопределения/абстрактного кодирования. Как это (в Котлине):

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

Ответ 6

Вы уже используете 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();
}

Robolectric версия 4.3