Тестирование на Android: как проверить диалог отображается на экране? (с использованием ActivityInstrumentationTestCase2)

Я пытаюсь, наконец, добавить тесты пользовательского интерфейса в свое приложение для Android, чтобы увеличить охват (все мои другие слои прошли надлежащую проверку, поэтому все мои ошибки теперь появляются из пользовательского интерфейса...) Я начал использовать ActivityInstrumentationTestCase2 в качестве базового класса для модульных тестов эмулятора, а простые вещи легко проверить и сработать.

Но теперь я пытаюсь проверить Диалог, как ожидалось, и я не знаю, как это сделать.

Мой тест:

public void testOpensAboutDialogWhenAboutButtonClicked() {
    final MyActivity activity = getActivity();
    final Instrumentation instrumentation = getInstrumentation();

    final Button aboutButton = (Button) activity.findViewById(R.id.about);
    TouchUtils.clickView(this, aboutButton);

    // how to test for the AboutDialog?
}

Теперь мой диалог не имеет идентификатора, поэтому я не могу получить указатель на него с помощью findViewById. Он создан с использованием доступных классов-конструкторов:

final AlertDialog about = new AlertDialog.Builder(parent)
            .setTitle(parent.getString(R.string.about_title))
            .setCancelable(true)
            .setIcon(R.drawable.skull)
            ....

Любые идеи или указатели на учебные пособия?

EDIT: Чтобы ответить на комментарий Jens, я не, используя управляемые диалоги, просто создав AlertDialog и показывая его с помощью .show()

Ответы

Ответ 1

Поскольку вы уже используете ActivityInstrumentationTestCase2, вы должны начать использовать Robotium - это упростит ваше тестирование много.

Для вашего дела это так же просто, как это (если вы знаете ожидаемое название или что-то еще неопределенное в своем диалоговом окне):

public void testSomeRandomSentence() {
    Solo solo = new Solo(getInstrumentation(), getActivity());
    getInstrumentation().waitForIdleSync();
    // Now do whatever you need to do to trigger your dialog.

    // Let assume a properly lame dialog title.
    assertTrue("Could not find the dialog!", solo.searchText("My Dialog Title"));
}

Ответ 2

после присвоения id Toast в setUp()

toast = (Toast)activity.findViewById(..........);

создать тестовый файл() {

ViewAsserts.assertOnScreen(toasts.getRootView(), toast.getRootView());
//pass if toast is visible on screen

}

Ответ 3

добавьте геттер в ваш диалог, например:

public AlertDialog get_aboutbox()
{
   return this.about;
}

то вот решение для вашего теста:

public void testOpensAboutDialogWhenAboutButtonClicked() {
    final MyActivity activity = getActivity();

    assertNotNull("aboutbox is null",activity.get_aboutbox());
    final Instrumentation instrumentation = getInstrumentation();

    final Button aboutButton = (Button) activity.findViewById(R.id.about);
    TouchUtils.clickView(this, aboutButton);

    assertTrue("About Button didn't displayed the Dlg",
               activity.get_aboutbox().isShowing());
}