2016-06-24 2 views
0

У меня есть следующий тест блок:Выход блока теста распечатывается после выполнения теста закончил

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

Причина, по которой ваш тест не терпит неудачу, заключается в том, что ваш блок 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)) 
Смежные вопросы