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

Как проверить меню

Мне нужно покрыть функциональность меню с помощью модульных тестов, однако я изо всех сил пытаюсь получить объект Menu.

Сбой тестового теста (mMenu is null):

sendKeys(KeyEvent.KEYCODE_MENU);
mMenu = (Menu) mActivity.findViewById(com.###.###.R.id.main_menu);
assertNotNull(mMenu);

Прошу совета. Спасибо.

4b9b3361

Ответ 1

Я столкнулся с этим самым сценарием и придумал следующее (очень простое) решение в моей реализации ActivityInstrumentationTestCase:

...
ActivityMonitor am = getInstrumentation().addMonitor(LoginActivity.class.getName(), null, false);

// Click the menu option
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
getInstrumentation().invokeMenuActionSync(mActivity, R.id.logout, 0);

Activity a = getInstrumentation().waitForMonitorWithTimeout(am, 1000);
assertEquals(true, getInstrumentation().checkMonitorHit(am, 1));
a.finish();
...

Этот фрагмент кода выполняет три функции:

  • Щелчок по пункту меню,
  • Гарантирует, что мы перейдем к соответствующему действию после нажатия кнопки меню и
  • завершает начатую работу (очень важно для тестов, следующих за этим).

Надеюсь, это поможет.

Ответ 2

Что именно вы пытаетесь протестировать? Эти пункты меню выполняют правильное действие?

Вы можете вызвать Activity.openOptionsMenu(), чтобы открыть меню и получить ссылку на меню, переопределив один из методов onMenu. В этот момент вы можете использовать Menu.performIdentifierAction для выбора пунктов меню.

Ответ 3

Если вы хотите выполнить пользовательский интерфейс, системные или функциональные тесты, я бы рекомендовал вам использовать Robotium. Затем вы можете просто использовать sendKey (Solo.MENU), а затем щелкнуть по элементам меню с помощью кнопки clickOnText() или clickOnView(). Когда вы это сделаете, вы сможете утверждать правильное поведение. Просто утверждать, что это не должно быть null, недостаточно. Вы должны проверить Robotium, более подходящим для использования при тестировании таких вещей.

Ответ 4

    Activity act =launchActivity(intent);

    MenuBuilder builder=new MenuBuilder(mInst.getTargetContext());

    act.onCreateOptionsMenu(builder);



    act.onPrepareOptionsMenu(builder);

    Log.i(TAG, "BuilderSize: "+builder.size());
    int visible=0;
    for(int i=0;i<builder.size();i++)
    {
        MenuItem item=builder.getItem(i);

        if(item.isVisible()&& item.isEnabled())
        {
            Log.i(TAG, item.getTitle().toString());
            visible++;
        }
    }
    act.finish();

Ответ 5

Используйте прибор, чтобы проверить нажатие на пункт меню.

Вот пример моего тестового примера, который вызывает меню "Настройки", которое запускает другое действие.

public void testCanGoToSettings() {
    final MainActivity activity = getActivity();

    Instrumentation.ActivityMonitor am = getInstrumentation().addMonitor(ConfigureActivity.class.getName(),
            null /* result */, true /* block */);

    getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
    getInstrumentation().invokeMenuActionSync(activity, R.id.menu_settings, 0 /* flags */);

            /* if not block in addMonitor() above, then comment out this...
    Activity a = getInstrumentation().waitForMonitorWithTimeout(am, 1000);
    a.finish();
            */ 

}