android - 不休眠测试 PendingIntent 发送

标签 android unit-testing android-pendingintent

我得到了以下测试用例:

Intent intent = new Intent("test");
PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("test");
testReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    recieved=true;
  }
};
getContext().registerReceiver(testReceiver,intentFilter );
pendingIntent.send();
Thread.sleep(100);

assertTrue(recieved);

有没有办法在没有 Thread.sleep 的情况下使这个测试通过?

最佳答案

您可以使用 CountDownLatch 来等待类似事件的发生。你用一个计数来初始化它。 await() 方法将等待计数达到 0。当计数达到 0 时,它们将停止阻塞(或者如果您指定超时,如果在计数达到 0 之前超时,它将返回 false)。

这是您修改后的示例代码以使用 CountDownLatch:

CountIntent intent = new Intent("test");
PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("test");

final CountDownLatch countDownLatch = new CountDownLatch(1);
testReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    countDownLatch.countDown();
  }
};
getContext().registerReceiver(testReceiver,intentFilter );
pendingIntent.send();

assertTrue(countDownLatch.await(1, TimeUnit.SECONDS));

关于android - 不休眠测试 PendingIntent 发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118544/

相关文章:

ruby-on-rails - Ruby on Rails 中的全栈测试选项

android - Android 11 上未检测到 NFC

java - 如何使用日期时间戳对文件进行排序

java - 将多个图像或文件上传到 firebase 中的存储并获取其 uri 并将 uri 放入数据库中

django - 如何模拟 celery 任务的绑定(bind)上下文

c# - 使用我的 NuGet 包分发可重用测试类有哪些选项?

android - requestLocationUpdates with PendingIntent 和 Broadcast - 我得到什么广播

java - AlarmManager 立即触发警报

android - 如何解决警告 - 对于 Android 11 中不可用的 Google map 版本 1

android - FileOutputStream wit 数据库文件在 Android 9 上不再工作