Могу ли я тестировать уведомления о статусных базах с помощью платформы тестирования Android?

У меня есть класс, который отправляет уведомление о состоянии в Android. Я не могу найти способ проверить, было ли отправлено уведомление или нет, что очень затрудняет запись любого полезного unit test.

У кого-нибудь есть решение для этого?

Ответ 1

Возможно, не ответ, который вы ищете, но, как обычно, это решение:

  • Создайте интерфейс, абстрагирующий функции уведомления.
  • Создайте реализацию по умолчанию, которая делегирует API системных уведомлений.
  • При выполнении тестов заменить (или украсить) реализацию по умолчанию макетной реализацией, поддерживающей тестирование.

Это можно упростить по следующей технологии:

  • Рамки внедрения зависимостей (например, RoboGuice) для оптимизации выбора реализации.
  • Mocking library (например, EasyMock) для автоматизации создания макетных реализаций.

Ответ 2

Попробуйте создать объект Mock, расширив NotificationManager и переопределив методы notify(). Можно утверждать, что переопределенные функции. В тестовом случае (ых), введите Mock в предметную активность и запустите тесты с помощью Android JUnit Test.

Ответ 3

Robotium не может взаимодействовать с панелью уведомлений. Вы ограничены одним приложением. Проверьте FAQ для robotium, есть упоминание об этом: http://code.google.com/p/robotium/wiki/QuestionsAndAnswers

Ответ 4

Тестирование пользовательского интерфейса

Это то, что вы хотите, я думаю. Uiautomator.

Работает только на Android 4.1 или выше. Сначала вам нужно запустить пример кода.

Вы можете написать фрагмент кода, чтобы выполнить действие pull-down-status-bar, а затем делать свои вещи. Это только тестирование пользовательского интерфейса. Вы не можете проверить свои данные с помощью uiautomator.

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

Ответ 5

Решает подобную ситуацию, сохраняя детали уведомлений в хранилище данных перед отправкой и маркировкой как подтвержденные всякий раз, когда пользователь входит в приложение через панель уведомлений. Поскольку роботизм ограничен границами приложений, он не может получить доступ к системным данным, поэтому проверял поведение с использованием junit/jmockit на основе unit test.

Ответ 6

Вы можете использовать эмулятор, только для этих тестов, с Android Marshmallow (api 23).

Например:

 public void testCheckNotification_2() throws IOException, InterruptedException, GcmException
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        GcmResponse gcmResponse = endPointImp.sendGcmMulticastRequestImp(getGcmMultiRequest());
        assertThat(gcmResponse.getSuccess(), is(1));
        Thread.sleep(2000);
        assertThat(mManager.getActiveNotifications().length, is(1));
        StatusBarNotification barNotification = mManager.getActiveNotifications()[0];
        assertThat(barNotification.getId(), is(INCIDENCIA.getTitleRsc()));

        // We check the pending intent.
        PendingIntent pendingIntent = barNotification.getNotification().contentIntent;
        assertThat(pendingIntent.getCreatorPackage(), is(GcmRequest.PACKAGE_DIDEKINDROID));
    }
}

Важной частью является вызов NotificationManager (mManager), чтобы проверить, что он имеет активные уведомления после отправки сообщения многоадресной рассылки на конечную точку http-сервера Google FCM.

Ответ 8

Просто, чтобы немного сохранить других: вещь, которая похожа на нее, должна обнаруживать уведомления, но не пытается создать PendingIntent с флагом NO_CREATE.

Поскольку попытки создания PendingIntent с теми же значениями, что и существующее уведомление, но с флагом NO_CREATE, должны возвращать значение null, казалось, что это скажет, имело ли уведомление одно или нет.

К сожалению, это не кажется надежным.