use*_*225 7 java android unit-testing robolectric
我有一个非常简单的类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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如上所示,当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);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望每5秒看一次System.out.println()" handling message …".但是,当我运行测试时,我只在终端中看到一次消息.
它看起来像handler的Looper只用于运行一个任务,然后停了下来.
如果我是对的,如何保持弯针在Robolectric一直运行?如果我错了,为什么我只看到一条日志消息?
==========更新===========
我试过@rds的答案,我换成Thread.sleep(30 * 1000);了:
for (int i = 0; i < N; i++){
shadowLooper.runToEndOfTasks();
}
Run Code Online (Sandbox Code Playgroud)
现在我可以看到N次" handling message …".但是,整个测试并未模拟延迟.发送消息时我有5秒的延迟handler.sendMessageDelayed(handler.obtainMessage(…), 5000),是不是Robolectric框架根本不模拟这种延迟消息?我如何延迟测试?
问题是,当您调用时,runToEndOfTasks();此阶段只有一项任务。
shadowLooper.runToEndOfTasks();您应该调用N 次以对处理程序进行 N 次调用,而不是让测试线程休眠。
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |