试验并发执行,我想知道如何实际测试它。执行流具有副作用性质,创建期货是为了包装独立的执行/处理。
一直在寻找一些关于如何正确单元测试以下场景的好例子( foo
和 bar
是我希望测试的方法):
场景# 1
<>之前def foo: Unit = {未来{做某事}未来{doSomethingElse}}private defdosomething: Unit = serviceCall1private def doSomethingElse: Unit = serviceCall2之前情景动机
foo
立即返回,但调用2个执行单独任务的期货(例如保存分析和存储记录到DB)。这些服务调用可以被模拟,但我要测试的是,一旦我将这两个服务包装在Future
s
场景# 2
<>之前def bar: Unit = {val futureX = doAsyncXval futureY = doAsyncY为{x <- futureX-未来} yield {等待(x, y)}}之前情景动机
从可以并发执行的长时间运行计算开始(例如获得总访问者数量并获得我们网站经常使用的User-Agent
头)。将结果合并到其他操作中(在本例中,Unit
方法只是抛出值)
注意我对actor和测试actor很熟悉,但是考虑到上面的代码,我想知道什么应该是最合适的方法(包括重构)
EDIT我现在在做什么
<>之前隐含值context = ExecutionContext.fromExecutor(testExecutor)def testExecutor = {new Executor {def execute(runnable: runnable) = runnable.run}}之前这个ExecutionContext
实现不会将Future
作为一个单独的线程运行,整个执行将按顺序完成。这感觉有点像一个hack,但基于Electric Monk的答案,似乎另一个解决方案更相似。
一个解决方案是使用DeterministicExecutor。这不是一个scalaesque的解决方案,但应该是这样的技巧。
如果您正在使用ScalaTest,请查看:http://doc.scalatest.org/2.0/index.html#org.scalatest.concurrent.Futures
Specs2也支持测试期货:http://etorreborre.github.io/specs2/guide/org.specs2.guide.Matchers.html
ScalaTestX支持异步非阻塞测试