junit 我可以使用Android的测试框架来测试状态栏通知吗?

bwitn5fc  于 2022-11-11  发布在  Android
关注(0)|答案(8)|浏览(132)

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

prdp8dxp

prdp8dxp1#

也许这不是你要找的答案,但像往常一样,解决办法是:

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

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

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

j2qf4p5b2#

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

u4dcyp6a

u4dcyp6a3#

Robotium无法与通知栏交互。您只能使用一个应用程序。请查看Robotium的常见问题解答,其中提到:http://code.google.com/p/robotium/wiki/QuestionsAndAnswers

egdjgwm8

egdjgwm84#

UI Testing
我想这就是你想要的。uiautomator。
仅适用于Android 4.1或以上版本。您可能需要先运行示例代码。
你可以写一段代码来执行下拉状态栏的操作,然后做你的事情。这只是UI测试,你不能用uiautomator测试你的数据。
希望这能有所帮助。

yacmzcpb

yacmzcpb5#

您可以使用模拟器来进行此类测试,其中包含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端点发送多播消息后是否有活动的通知。

nzk0hqpo

nzk0hqpo6#

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

wz8daaqr

wz8daaqr7#

检查通知监听器服务:
当发布或删除新通知或更改其排名时,从系统接收调用的服务。
https://developer.android.com/reference/android/service/notification/NotificationListenerService.html

2sbarzqh

2sbarzqh8#

只是为了保存别人一些时间:一个看起来应该检测通知但实际上没有检测到的东西是试图创建一个带有NO_CREATE标志的PendingIntent。
由于尝试使用与现有通知相同的值创建PendingIntent,但使用NO_CREATE标志,应返回null,因此似乎可以告诉通知是否已经有一个PendingIntent。
遗憾的是,这似乎并不可靠。

相关问题