2010-06-24 77 views
13

如何等待Scala演員退出()?我在單元測試中設置了兩個Actor,併發送一些消息讓他們開始。他們來回發送一些消息,最終都會調用exit()。如何讓我的單元測試等待兩位演員在通過之前完成?等待演員退出()

回答

7

如果您事先知道演員之間交換的消息數量,則可以使用java.util.concurrent.CountDownLatch來跟蹤消息的數量。在演員,消息的每個處理後,做

latch.countDown() 

,並在你的主線程做

latch.await() 

這將使你的主線程等待到鎖存器的計數下降到零。

如果您事先不知道消息的數量,但有一個條件表示完成,那麼您可以使用java.util.concurrent.locks.Condition。在演員,當你的條件滿足時,做

if (conditionSatisfied) 
    condition.signal() 

和你的主線程做

while (!conditionSatisfied) 
condition.await() 

,使其等到條件滿足。

有關詳細信息,請參閱CountDownLatchCondition的javadocs。

參見this Gist例如使用Condition

+1

我可以COUNTDOWN()之前退出()並只計爲1.這似乎是多餘的,因爲這兩種方法總是一起調用。 – 2010-06-24 04:50:40

+0

我不明白。你想讓主線等到演員完成,對嗎?這就是'await()'調用的功能。 – 2010-06-24 04:59:52

+0

這意味着我必須爲生產代碼(演員)添加一個閂鎖或條件,純粹用於JUnit測試(等待Actor)。 – 2010-06-24 05:06:41

2

在規格上你可以使用Eventually Matchers。如果你知道你的演員的最終狀態或任何實體(比如,持久存儲)它修改,你可能會迫使測試等待,直到切換到該狀態會發生:

<entity state> must eventually(10, 1.second)(be(<state>)) // there will be 10 retires every second, and if the state will be different, exception is thrown 
+1

這會讓單元測試花費大約十分之一秒來運行,這太慢了。 – 2010-06-29 13:51:21