【发布时间】:2016-03-09 07:09:39
【问题描述】:
我有一个非常简单的类,它有一个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 …”。但是,当我运行测试时,我只能在终端中看到消息 once。
看起来 handler 的 Looper 只运行了 一个 任务,然后就停止了。
如果我是对的,如何让弯针在 Robolectric 中一直运行?如果我错了,为什么我只看到一条日志消息?
========== 更新 ===========
我尝试了@rds 的答案,我将Thread.sleep(30 * 1000); 替换为:
for (int i = 0; i < N; i++){
shadowLooper.runToEndOfTasks();
}
现在我可以看到 N 次“handling message …”。但是,整个测试并没有模拟延迟。我用handler.sendMessageDelayed(handler.obtainMessage(…), 5000)发送消息时有5秒延迟,是不是Robolectric框架根本不模拟这种延迟消息???我的考试怎么会有延迟?
【问题讨论】:
标签: java android unit-testing robolectric