gpt4 book ai didi

使用即发即忘 Futures 进行 Scala 测试

转载 作者:行者123 更新时间:2023-12-02 04:09:20 25 4
gpt4 key购买 nike

所以我有一些带有端点的服务器代码,我想在其中异步运行东西。为此,我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com