作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一些带有端点的服务器代码,我想在其中异步运行东西。为此,我正在使用 future 。有些任务会导致结果,但也有昂贵的 IO 任务不会,所以我在火中执行它们并忘记 Future,如下所示:
import scala.concurrent.Future
val ec = scala.concurrent.ExecutionContext.global
Future {
Thread.sleep(10000)
println("Done")
}(ec)
println("Exiting now")
输出是:
import scala.concurrent.Future
ec: scala.concurrent.ExecutionContextExecutor = scala.concurrent.impl.ExecutionContextImpl@2315ca48
res0: scala.concurrent.Future[Unit] = scala.concurrent.impl.Promise$DefaultPromise@7d1e50cb
Exiting now
res1: Unit = ()
通常在服务器上这并不是什么大问题,因为上下文在接收其他任务时会保持运行,因此 IO 可以完成。但是当我测试时,测试完成并且里面的任务开始抛出,因为他们使用的服务变得不可用。
所以问题是:我如何等待这些“即发即忘”的 future ,而又不会阻止我的主要执行?
最佳答案
为了说明我的答案,让我们假设您访问一些 fileService
来加载“即发即弃”部分中的文件,并且您使用 Mockito (或其他模拟框架,想法保持不变)用于您的单元测试。然后,我在解释中提到的代码将如下所示:
class SystemUnderTest(val fileService: MyFileService) {
def testedMethod(): GoodResult = {
val file = // ... some logic to extract file ...
Future {
fileService.uploadFile(file)
}
// ... other logic returning an instance of GoodResult
}
}
然后,在您的测试中混合 org.scalatest.Eventually
并做出如下断言:
eventually {
verify(fileService).uploadFile(any())
}
它将确保主进程在验证 uploader 服务已被调用(或implicit PatientConfig
定义的超时已过期)之前不会退出。
当然,您始终可以选择返回您不在生产代码中等待的 Future,并在测试中等待它。
关于使用即发即忘 Futures 进行 Scala 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37720995/
我是一名优秀的程序员,十分优秀!