我有一个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调用来模拟它的问题。但我只想确认这是否正确。
对我来说,除此之外别无他法。如果我尝试使用我的测试复制应用程序的实际行为,那么即使日志记录的未来仍在继续,测试的主线程也应该完成并终止;测试中没有回调,也不存在。
答案 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