【发布时间】:2014-09-29 21:24:50
【问题描述】:
尝试并发执行我想知道如何实际测试它。 执行流程具有副作用性质,并创建期货来包装独立的执行/处理。
一直在寻找一些关于如何正确单元测试以下场景的好例子(foo 和 bar 是我希望测试的方法):
场景 #1
def foo : 单位 = { 未来{做某事} 未来 { doSomethingElse } } 私人 def doSomething : 单位 = serviceCall1 私人定义 doSomethingElse :单位 = serviceCall2情景动机
foo 立即返回,但调用 2 个执行单独任务的期货(例如,保存分析并将记录存储到数据库)。这些服务调用可以被模拟,但我要测试的是,一旦我将它们包装在Futures 中,这两个服务都会被调用
场景 #2
def bar : 单位 = { val futureX = doAsyncX val futureY = doAsyncY 为了 { x情景动机
从可以同时执行的长时间运行的计算开始(例如,获取总访问者的数量并获取我们网站上经常使用的User-Agent 标头)。将结果合并到其他操作中(在这种情况下,Unit 方法只是简单地抛出值)
注意我对演员和测试演员很熟悉,但是鉴于上面的代码,我想知道什么应该是最合适的方法(包括重构)
编辑 我现在在做什么
隐式值上下文 = ExecutionContext.fromExecutor(testExecutor) def testExecutor = { 新执行者{ def execute(runnable : Runnable) = runnable.run } }此ExecutionContext 实现不会将Future 作为单独的线程运行,整个执行将按顺序完成。这有点像 hack,但基于 Electric Monk 的回答,似乎其他解决方案更相似。
【问题讨论】:
-
我删除了我的答案,因为它不是主题,但你真的应该更清楚地解释你的问题。
-
@GabrielePetronella 感谢您的回答和评论。我已经编辑了我的答案,以(希望)更好地反映我的意图。
-
唯一需要测试的是 foo 调用了 2 个方法 doSomething 和 doSomethingElse 吗?您正在寻找证明他们被召唤并且不在乎他们做什么的证据?
-
@Nimrod007 正确。场景 #1 测试两个服务都被调用。场景 #2 更复杂,但
noOp可以是一个模拟服务,我希望测试它是否按预期调用 -
除了切换到实际返回 Futures(可能是更好的选择)之外,我看到的唯一选择是使用顺序执行器(就像你所做的那样),或者破解你的模拟服务标记一个条件你可以在测试代码中等待。
标签: scala unit-testing asynchronous future