Scala测试异步和等待方法

时间:2015-09-25 11:10:08

标签: scala asynchronous async-await

我有一个使用Scala Async库的服务。我主要使用这个库来计算数据库调用时间。我想测试的方法包含使用async await机制对数据库的多次调用。我所拥有的伪代码如下:

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)

我只是试图通过运行我的单元测试来调试myMethod,该单元测试即使在进入secondCall之前也会以测试成功返回。我的意思是我在对数据库的所有3次调用中都有断点,但IntelliJ调试器只要完成对数据库的第一次调用就会退出。为什么是这样?如何使用IntelliJ调试器测试此行为?

2 个答案:

答案 0 :(得分:2)

我不确定我的答案是否满足您的期望,但这是一个已知问题。问题是async / await是一个非常复杂的宏,它会对树进行大量转换(您可以通过启用-Xprint:<phase_name_after_typer>标志来检查输出)。不幸的是,现有的IDE(我都没有使用Intellij和Ensime)都可以调试它,但是我不熟悉它们的内部结构来解释为什么它们不能详细说明。

根据我的经验,我无法找到任何关于本机理解的优秀专业人员,因此您可以坚持使用原生语法或显式平面图调用,这样可以很好地调试。

答案 1 :(得分:0)

此构造可用于depdesndant异步调用。 async / await添加了一些糖来使这更容易,但要手工制作,你可以这样做:

def dbMethodDependant : Future[T] = for {
  res1 <- firstCall
  res2 <- secondCall(res2)
  res3 <- thirdCall(res3)
} yield res3

Await.result(dbMethodDependant, forever)