Имитация щелчка по пункту меню в Robolectric
Довольно просто имитировать нажатие кнопки в Robolectric:
Button someButton = (Button) findViewById(R.id.some_button);
someButton.performClick();
Однако я не могу понять, как сделать то же самое с элементом меню. Я создаю меню в Activity.onCreateOptionsMenu
, как я могу имитировать щелчок на одном из своих элементов?
Ответы
Ответ 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