单元测试 Scala Future 阻塞上下文

Unit Testing Scala Future Blocking Contexts

我有一些代码是这样的:

def someFunctioThatIWantToUnitTest() {
  val p = Promise[Int]()

  val result = getFutureInt(p)
  val resultFut = result.future

  // I extract the content in the resultFut and do what I want
  val didSomething = resultFut.get // not able to get here with my unit test
}

getFutureInt(...) 看起来像这样:

private def getFutureInt(promise: Promise[Int]) {
  blocking { // from the scala concurrent object
    // here I successfully return the promise with an Int value
    promise.success(2)
  }
}

假设有合适的 ExecutionContexts 可用,我想测试 someFunctioThatIWantToUnitTest 方法!当我尝试调试我的单元测试时,它不允许我进入阻塞块并且我的测试 returns 失败了。有办法解决这个问题吗?

scala.concurrent.Await.result能解决您的问题吗?

val myFuture = Future(1)
val result: Int = Await.result(myFuture, 1.minute)

还请记住,如果您的测试由于 Future.get 调用而提前失败,您可能永远不会捕获任何 "Future" 断点。这是因为测试可能比您预期的更早停止,顺便破坏所有执行上下文。 (我不知道内部结构如何说 100%。)