完成测试后打印的单元测试输出

时间:2016-06-24 19:08:59

标签: scala scalacheck

我有以下单元测试:

  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的代码后返回。

我该怎么做?

1 个答案:

答案 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))