我有一个非常简单的类,它有一个Handler,当它处理消息时它再次发送新消息:
@H_404_2@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测试上面的类:
@H_404_2@@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);通过:
@H_404_2@for (int i = 0; i < N; i++){ shadowLooper.runToEndOfTasks(); }现在我可以看到N次“处理消息……”.但是,整个测试并未模拟延迟.使用handler.sendMessageDelayed(handler.obtainMessage(…),5000)发送消息时,我有5秒的延迟,是不是Robolectric框架根本不模拟这种延迟消息?我如何延迟测试?