34

我有一个在 Android 中发送状态栏通知的类。我找不到测试通知是否发送的方法,这使得编写任何有用的单元测试变得非常困难。

有人对此有解决方案吗?

4

8 回答 8

6

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

  • 创建一个抽象通知功能的接口。
  • 创建一个委托给系统通知 API 的默认实现。
  • 运行测试时,用支持测试的模拟实现替换(或装饰)默认实现。

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

  • 依赖注入框架(例如 RoboGuice)来简化实现的选择。
  • 模拟库(例如 EasyMock)自动创建模拟实现。
于 2012-01-09T06:10:41.687 回答
4

尝试通过扩展NotificationManager并覆盖notify()方法来创建 Mock 对象。可以断言被覆盖的函数。在您的测试用例中,将 Mock 注入主题活动并使用 Android JUnit Test 运行测试。

于 2012-04-01T19:18:28.680 回答
2

Robotium 无法与通知栏交互。您仅限于一个应用程序。检查robotium的常见问题,提到了这一点: http ://code.google.com/p/robotium/wiki/QuestionsAndAnswers

于 2011-04-06T21:48:44.807 回答
2

用户界面测试

我想这就是你想要的。uiautomator。

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

您可以编写一段代码来执行下拉状态栏操作,然后执行您的操作。这只是 UI 测试。您无法使用 uiautomator 测试您的数据。

希望这会有所帮助。

于 2013-01-05T07:20:54.360 回答
2

您可以将模拟器与 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) 以检查它在向 Google FCM http 端点发送多播消息后是否有活动通知。

于 2016-06-08T15:55:24.570 回答
1

通过在发送之前将通知详细信息存储在数据存储中并在用户通过通知栏进入应用程序时标记为已确认来解决类似的情况。由于 robotsium 仅限于应用程序边界,因此它无法访问系统数据,因此使用基于 junit/jmockit 的单元测试来测试行为。

于 2012-02-08T12:55:12.133 回答
0

查看 NotificationListenerService:

“一种在发布或删除新通知或它们的排名发生变化时从系统接收呼叫的服务。”

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

于 2015-09-07T01:48:36.443 回答
-1

只是为了节省其他人一些时间:一个看起来应该检测通知但没有检测到的东西正在尝试使用 NO_CREATE 标志创建一个 PendingIntent 。

由于尝试使用与现有通知相同的值但使用 NO_CREATE 标志创建 PendingIntent 应该返回 null,这似乎可以判断通知是否已经有一个。

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

于 2013-12-12T09:22:01.220 回答