在做出断言之前等待未来完成

时间:2016-01-08 14:34:05

标签: scala scalatest

我有一个Scala Play应用程序,其中一个控制器触发Future进行一些日志记录。我有一个简单的回调函数,它在Future完成时执行。

我已经编写了一个测试来检查是否发生了这种日志记录。粗略的逻辑如下:

feature{

  scenario{
    Given()
      // set up the call
    When()
      // make a FakeRequest via reverse routing - logging will done in a separate thread via a Future
    Then()
      Thread.sleep(50) // sleep to allow logging to finish
      // check if the logging has been done

问题是Thread.sleep。我已经添加了这个调用来阻止主测试线程,以便为Future提供足够的时间,在实际执行检查以查看日志记录是否已完成之前,在单独的线程中完成日志记录。

我的问题是,是否有更好的方法来做到这一点?实际上,如果我的应用程序正在运行并且日志记录花费了过多的时间,则管理应用程序的主线程将不会终止,直到在单独的线程中执行日志记录的Future完成。所以我没有看到上面的Thread调用来模拟它的问题。但我只想确认这是否正确。

对我来说,除此之外别无他法。如果我尝试使用我的测试复制应用程序的实际行为,那么即使日志记录的未来仍在继续,测试的主线程也应该完成并终止;测试中没有回调,也不存在。

1 个答案:

答案 0 :(得分:1)

假设您正在使用ScalaTest;你可以使用whenReady构造;它会定期检查已通过的未来,直到它准备就绪或已超过配置的超时; 看到 http://www.artima.com/docs-scalatest-2.0.M5/org/scalatest/concurrent/Futures.html

http://doc.scalatest.org/2.0/index.html#org.scalatest.concurrent.ScalaFutures