Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以使用Android';什么是测试框架?_Java_Android_Unit Testing_Junit_Android Notifications - Fatal编程技术网

Java 我可以使用Android';什么是测试框架?

Java 我可以使用Android';什么是测试框架?,java,android,unit-testing,junit,android-notifications,Java,Android,Unit Testing,Junit,Android Notifications,我有一个类在Android中发送状态栏通知。我找不到测试通知是否被发送的方法,这使得编写任何有用的单元测试都非常困难 有人对此有解决方案吗?Robotium无法与通知栏交互。您只能使用一个应用程序。查看robotium的常见问题,其中提到: 也许不是你想要的答案,但通常的解决办法是: 创建一个抽象通知功能的接口 创建委派给系统通知API的默认实现 运行测试时,使用支持测试的模拟实现替换(或修饰)默认实现 这可以通过以下技术简化: 依赖注入框架(如RoboGuice)简化了实现的选择 模拟库

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


有人对此有解决方案吗?

Robotium无法与通知栏交互。您只能使用一个应用程序。查看robotium的常见问题,其中提到:
也许不是你想要的答案,但通常的解决办法是:

  • 创建一个抽象通知功能的接口
  • 创建委派给系统通知API的默认实现
  • 运行测试时,使用支持测试的模拟实现替换(或修饰)默认实现
这可以通过以下技术简化:

  • 依赖注入框架(如RoboGuice)简化了实现的选择
  • 模拟库(如EasyMock)自动创建模拟实现

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

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

我想这就是你想要的。机器人

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

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


希望这会有所帮助。

只是为了给其他人节省一些时间:一个看起来应该能检测到通知但却不能检测到的东西,正在尝试创建一个带有NO_create标志的PendingEvent

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


遗憾的是,这似乎不可靠。

请查看NotificationListenerService:

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


您可以使用仿真器,仅用于此类测试,使用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 FCM http端点发送多播消息后检查它是否有活动通知。

有一个名为robotium的测试框架,但我不知道它是否支持通知。但是,如果标准junit库不支持它,您可以在那里进行检查。