Biv*_*vas 6 unit-testing asynchronous scala future
尝试并发执行我想知道如何实际测试它.执行流程具有副作用,并且创建期货以包装独立的执行/处理.
一直在寻找一些关于如何正确单元测试以下场景的好例子(foo以及bar我想测试的方法):
场景#1
def foo : Unit = {
Future { doSomething }
Future { doSomethingElse }
}
private def doSomething : Unit = serviceCall1
private def doSomethingElse : Unit = serviceCall2
情景动机
foo立即返回,但调用2个期货执行单独的任务(例如,将分析和存储记录保存到DB).这些服务调用可以被模拟,但我试图测试的是,一旦我将它们包装在Futures中,这两个服务都被调用
场景#2
def bar : Unit = {
val futureX = doAsyncX
val futureY = doAsyncY
for {
x <- futureX
y <- futureY
} yield {
noOp(x, y)
}
}
情景动机
从可以同时执行的长时间运行计算开始(例如,获取总访问者数量并将常用User-Agent标题添加到我们的网站).将结果合并到其他一些操作中(在这种情况下Unit,简单地抛出值的方法)
注意我熟悉演员和测试演员,但考虑到上面的代码,我想知道什么应该是最合适的方法(包括重构)
编辑 我现在在做什么
implicit value context = ExecutionContext.fromExecutor(testExecutor)
def testExecutor = {
new Executor {
def execute(runnable : Runnable) = runnable.run
}
}
此ExecutionContext实现不会Future作为单独的线程运行,整个执行将按顺序执行.这种感觉就像一个黑客,但根据Electric Monk的回答,似乎其他解决方案更像是一样.
如果您使用 ScalaTest,请查看:http://doc.scalatest.org/2.0/index.html#org.scalatest.concurrent.Futures
Specs2 还支持测试 Futures: http://etorreborre.github.io/specs2/guide/org.specs2.guide.Matchers.html