如何在单元测试中避免 Thread.sleep?

新手上路,请多包涵

假设我有以下应该测试的方法:

 @Autowired
private RoutingService routingservice;

public void methodToBeTested() {
    Object objectToRoute = initializeObjectToRoute();
    if (someConditions) {
         routingService.routeInOneWay(objectToRoute);
    } else {
         routingService.routeInAnotherWay(objectToRoute);
    }
}

在这种情况下 RoutingService 在单独的线程中运行,因此在它的构造函数中我们有以下内容:

 Thread thread = new Thread(this);
thread.setDaemon(true);
thread.start();

问题是 RoutingService 改变了 objectToRoute 的状态,这正是我想要检查的,但这不会立即发生,因此测试失败。但是,如果我添加 Thread.sleep() 那么它就可以工作,但据我所知这是不好的做法。

在这种情况下,如何避免 Thread.sleep()

原文由 Rufi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

如果你正在测试方法 methodToBeTested 的[ 单元测试],你应该简单地模拟 routingservice

您不应该测试 methodToBeTested 调用的任何方法。

但是,听起来您想测试 RoutingService (您说“问题是 RoutingService 改变了 的状态,我想要的正是 objectToRoute 去检查”)。

要测试 RoutingService 方法,您应该为这些方法编写单独的单元测试。

原文由 forgivenson 发布,翻译遵循 CC BY-SA 4.0 许可协议

我建议 等待 同步异步测试。例如,假设您有一个在某些线程操作后设置的结果对象并且您想要测试它。你这样写语句:

  await()
.atMost(100, TimeUnit.SECONDS)
.untilAsserted(() -> assertNotNull(resultObject.getResult()));

它最多等待 100 秒, 或者 直到断言得到满足。例如,如果 getResult() 在 0-100 秒之间返回不为 null 的内容,则执行会继续,这与 Thread.sleep 不同,Thread.sleep 会在给定时间内保持执行,而不管结果是否存在。

原文由 sarah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题