2010-10-28 2 views
33

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

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

+0

Там есть тестовая структура, названная robotium, но я не знаю, поддерживает ли она уведомления. Но в случае, если стандартный junit lib не поддерживает его, вы можете проверить там, возможно. http://code.google.com/p/robotium/ –

ответ

5

Может быть, не ответ, который вы ищете, но, как обычно, решение заключается в следующем:

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

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

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

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

4

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

2

UI Testing

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

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

Вы можете написать фрагмент кода для выполнения действия с вытаскиванием по статусу и затем выполнить свои действия. Это только тестирование пользовательского интерфейса. Вы не можете проверить свои данные с помощью uiautomator.

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

-1

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

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

К сожалению, это не похоже на надежность.

1

Вы можете использовать эмулятор, только для такого рода испытаний, с Android Зефир (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), чтобы проверить, что она имеет активные уведомления после отправки многоадресного сообщения в Google ТСМ HTTP конечной точки.