加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Robolectric:在我的情况下运行处理程序的looper

发布时间:2020-12-15 00:35:44 所属栏目:Java 来源:网络整理
导读:我有一个非常简单的类,它有一个Handler,当它处理消息时它再次发送新消息: public class MyRepeatTask{ … public void startTask() { // send message with delay 5 sec handler.sendMessageDelayed(handler.obtainMessage(…),5000); } Handler handler =
我有一个非常简单的类,它有一个Handler,当它处理消息时它再次发送新消息:
public class MyRepeatTask{
  …
  public void startTask() {
    // send message with delay 5 sec
    handler.sendMessageDelayed(handler.obtainMessage(…),5000);
  }

  Handler  handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // I put a log for unit test
            System.out.println(“handling message …”);
            // send message with delay again
            handler.sendMessageDelayed(handler.obtainMessage(…),5000);
        }
  }
}

如上所示,当调用startTask()时,处理程序将在5秒内开始发送消息.然后,在handleMessage()回调中,处理程序再次发送延迟5秒的消息.这样做的目的是重复执行某些任务(如System.out.println()).

我用Robolectric测试上面的类:

@RunWith(RobolectricTestRunner.class)
public class MyRepeatTaskTest {
  @Test
  public void testStartTask() {
    MyRepeatTask task = new MyRepeatTask();
    task.startTask();

    // run looper of ‘handler’ in task
    ShadowLooper shadowLooper = Shadows.shadowOf(task.handler.getLooper());
    shadowLooper.runToEndOfTasks();

    // sleep for 30 seconds
    Thread.sleep(30 * 1000);
  }
}

我希望每隔5秒看到System.out.println()消息“处理消息…”.但是,当我运行测试时,我只在终端中看到一次消息.

看起来处理程序的Looper只运行一个任务,然后就停止了.

如果我是对的,如何保持弯针在Robolectric一直运行?如果我错了,为什么我只看到一条日志消息?

==========更新===========

我试过@rds的回答,我替换了Thread.sleep(30 * 1000);通过:

for (int i = 0; i < N; i++){
   shadowLooper.runToEndOfTasks();
}

现在我可以看到N次“处理消息……”.但是,整个测试并未模拟延迟.使用handler.sendMessageDelayed(handler.obtainMessage(…),5000)发送消息时,我有5秒的延迟,是不是Robolectric框架根本不模拟这种延迟消息?我如何延迟测试?

解决方法

问题是当你调用runToEndOfTasks();在这个阶段只有一项任务.

你应该调用shadowLooper.runToEndOfTasks();而不是让测试线程休眠. N次对你的处理程序进行N次调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读