我有以下单元测试:
test("All - gather message") {
def fs: List[Future[Int]] = List(Future{
blocking {Thread.sleep(4000)}
println("Finished sleeping in future 1!")
1
}, Future {
blocking {Thread.sleep(3000)}
println("Finished sleeping in future 2!")
2
}, Future {
blocking {Thread.sleep(2000)}
println("Finished sleeping in future 3!")
3
})
val f: Future[List[Int]] = Future.all(fs)
f onComplete { case x => {
println("x is: " + x.get)
assert(x.get == List(1, 2, 3))
}
}
Await.ready(f, 5 seconds)
}
这是测试套件的一部分。
问题是,当我的代码没有产生正确的结果时,测试仍然会通过,并且测试套件中下一个单元测试的输出中会出现错误消息。
我认为这是因为一旦f
完成,测试函数就会返回,只有在此之后才会执行onComplete
块中的代码。
我希望测试函数仅在执行onComplete
的代码后返回。
我该怎么做?
答案 0 :(得分:1)
您的测试未失败的原因是您的onComplete块正在与实际测试方法不同的线程中运行。考虑这个测试:
class MyTest extends FlatSpec {
it should "get a List" in {
def fs: List[Future[Int]] = List(Future(1))
println("Test thread " + Thread.currentThread().getName)
val f: Future[List[Int]] = Future.sequence(fs)
f onComplete { case x => {
println("Complete thread " + Thread.currentThread().getName)
assert(x.get == List(5))
}}
Await.ready(f, Duration.Inf)
}
}
运行时,我们得到此输出,测试不会失败:
Test thread: ScalaTest-run-running-MyTest
Complete thread: ForkJoinPool-1-worker-11
您希望断言与测试位于同一个线程中。最终我认为你在onComplete之外寻找类似的东西:
assert(Await.result(f, 5 seconds) == List(1, 2, 3))