当前位置:  开发笔记 > 编程语言 > 正文

Robolectric:在我的案例中运行处理程序的looper

如何解决《Robolectric:在我的案例中运行处理程序的looper》经验,为你挑选了0个好方法。

我有一个非常简单的类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()回调中,handler再次发送延迟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()" handling message …".但是,当我运行测试时,我只在终端中看到一次消息.

它看起来像handlerLooper只用于运行一个任务,然后停了下来.

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

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

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

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

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

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有