我可以使用Android的testing框架testing状态栏通知吗?

我有一个类在Android中发送状态栏通知。 我找不到一个方法来testing通知是否被发送,这使得很难写出任何有用的unit testing

有没有人有这个解决scheme?

Solutions Collecting From Web of "我可以使用Android的testing框架testing状态栏通知吗?"

也许不是你正在寻找的答案,但像往常一样,解决scheme是:

  • 创build一个抽象通知function的接口。
  • 创build一个委托给系统通知API的默认实现。
  • 运行testing时,使用支持testing的模拟实现replace(或修饰)默认实现。

这可以通过以下技术简化:

  • dependency injection框架(如RoboGuice)简化实现的select。
  • 嘲笑库(如EasyMock)自动创build模拟实现。

尝试通过扩展NotificationManager来创build一个Mock对象,并覆盖notify()方法。 重写的函数可以被声明。 在您的testing案例中,将模拟注入主题活动并使用Android JUnit Test运行testing。

Robotium无法与通知栏进行交互。 你被限制在一个应用程序。 检查机器人的常见问题,提到这个: http : //code.google.com/p/robotium/wiki/QuestionsAndAnswers

UItesting

这是你想要我想的。 uiautomator。

仅适用于Android 4.1或更高版本。 您需要先运行示例代码。

你可以写一段代码来执行下拉状态栏动作,然后做你的事情。 这只是UItesting。 你不能用uiautomatortesting你的数据。

希望这会有所帮助。

通过在数据存储中存储通知详细信息之前解决了类似的情况,每当用户通过通知栏进入应用程序发送和标记为确认。 由于robotium仅限于应用程序边界,因此无法访问系统数据,因此使用基于junit / jmockit的unit testing来testing行为。

Android Marshmallow(api 23)可以使用模拟器,仅用于这些testing。

例如:

  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 FCM http端点之后,检查它是否具有活动的通知。

查看NotificationListenerService:

“在发布或删除新通知或更改其排名时接收系统呼叫的服务。”

https://developer.android.com/reference/android/service/notification/NotificationListenerService.html

只是为了节省一些时间:看起来应该检测通知,但没有,正试图用NO_CREATE标志创build一个PendingIntent。

由于尝试使用与现有通知相同的值创buildPendingIntent,但是使用NO_CREATE标志,应该返回null,它似乎会告诉通知是否已经有一个。

可悲的是,这似乎并不可靠。