java - Robolectric:在我的案例中运行处理程序的循环程序

标签 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);
        }
  }
}

如您所见,调用 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

看起来 handlerLooper 只运行了一个 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/

相关文章:

java - 文件读取循环中的 FileInputStream 内存泄漏

java - 如何使 <T extends E> 包含泛型类型参数?

android - Firestore/Firebase 无法从文件夹获取图像

java - 从 Telephony Manager 获取电话类型信息

Android:如何检测用户何时停止对着麦克风说话

c# - 单元测试 stub 方法

java - 使用 Spring 自动配置自定义 @Qualifier

java - 如何使用eclipse将maven生成的war文件部署到tomcat上?

c# - 打包 URL 和单元测试。我的环境有问题?

android - Mockito Android 单元测试