我有一个非常简单的类,它有一个 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
只运行了一个 one 任务,然后就停止了。
如果我是对的,如何让 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 框架根本不模拟这种延迟消息吗???我的考试怎么会有延迟?
最佳答案
问题是,当您调用 runToEndOfTasks();
时,此阶段只有一个任务。
不要让测试线程 hibernate ,您应该调用 shadowLooper.runToEndOfTasks();
N 次来调用您的处理程序。
关于java - Robolectric:在我的案例中运行处理程序的循环程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34086857/