출력

2016-06-24 1 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 

당신은 당신의 주장이 시험과 동일한 스레드에서가되고 싶어요. 궁극적으로 당신은 당신의 온 콤포넌트 밖에서 이와 같은 것을 찾고 있다고 생각합니다 :

assert(Await.result(f, 5 seconds) == List(1, 2, 3))