Scala测试异步和等待方法
我有一个利用Scala异步库的服务。我使用这个库主要是为数据库调用计时。我要测试的方法包含使用异步等待机制对数据库的多个调用。我的伪代码如下所示:Scala测试异步和等待方法,scala,asynchronous,async-await,Scala,Asynchronous,Async Await,我有一个利用Scala异步库的服务。我使用这个库主要是为数据库调用计时。我要测试的方法包含使用异步等待机制对数据库的多个调用。我的伪代码如下所示: def myDbMethod() = async { val firstCall = await(call the db and get the result) val secondCall = await(all the db and get the result) val thirdCall = await(all the db
def myDbMethod() = async {
val firstCall = await(call the db and get the result)
val secondCall = await(all the db and get the result)
val thirdCall = await(all the db and get the result)
...
}
在Scala测试单元测试中,我有
Await.result(myDbMethod(), 10.seconds)
我只是试图通过运行单元测试来调试我的方法,即使在进行第二次调用之前,单元测试也会返回测试成功。我的意思是,我在对数据库的所有3次调用中都有断点,但是IntelliJ调试器会在完成对数据库的第一次调用后立即退出。为什么会这样?如何使用IntelliJ调试器测试此行为?我不确定我的答案是否满足您的期望,但这是一个已知的问题。问题在于
async
/await
是一个相当复杂的宏,它在树上进行大量转换(您可以通过启用-Xprint:
标志来检查输出)。不幸的是,现有的IDE(我正在使用Intellij和Ensime)都不能调试它,但我不熟悉它们的内部结构,无法详细解释它们为什么不能调试
根据我的经验,我找不到比本机更好的理解方法,因此您可以坚持使用本机语法或显式flatmap调用,这是很好的可调试性。此构造可用于depdendant异步调用。 async/await添加了一些糖分使之更容易,但要手动形成,您可以这样做:
def dbMethodDependant : Future[T] = for {
res1 <- firstCall
res2 <- secondCall(res2)
res3 <- thirdCall(res3)
} yield res3
Await.result(dbMethodDependant, forever)
def dbmethodedependent:Future[T]=for{
res1我在尝试使用async/await库时撞到自己的腿了吗?该死。我需要找到一些方法来测试它!@sparkr你可以用await
或scalatest在READY
调用时测试它们,但不进行调试。另外,请注意,在你的代码段未来不会并行运行,请阅读最后一个例子中的每个调用返回一个未来。为什么您认为它不会并行运行?@sparkr这与您编写它以理解它是一样的。请检查和。为了并行运行它,您需要在变量中有一个未来,并等待结果。这些方法是相互依赖的吗?还是没有关系?它们是相互依赖的这就是为什么我必须使用这个库