如何等待Scala演員退出()?我在單元測試中設置了兩個Actor,併發送一些消息讓他們開始。他們來回發送一些消息,最終都會調用exit()。如何讓我的單元測試等待兩位演員在通過之前完成?等待演員退出()
Q
等待演員退出()
13
A
回答
7
如果您事先知道演員之間交換的消息數量,則可以使用java.util.concurrent.CountDownLatch
來跟蹤消息的數量。在演員,消息的每個處理後,做
latch.countDown()
,並在你的主線程做
latch.await()
這將使你的主線程等待到鎖存器的計數下降到零。
如果您事先不知道消息的數量,但有一個條件表示完成,那麼您可以使用java.util.concurrent.locks.Condition
。在演員,當你的條件滿足時,做
if (conditionSatisfied)
condition.signal()
和你的主線程做
while (!conditionSatisfied)
condition.await()
,使其等到條件滿足。
有關詳細信息,請參閱CountDownLatch
和Condition
的javadocs。
參見this Gist例如使用Condition
。
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
相關問題
- 1. GPars:等待演員完成
- 2. 等待Ruby子pid退出
- 3. CCleaner C3等待退出
- 4. 在噴霧路線中調用演員並等待演員的響應
- 5. AS2等待退貨
- 6. javascript:等待退貨
- 7. 等待所有的pid退出php
- 8. 不要等待進程退出
- 9. 進程等待退出不起作用
- 10. VBA shell和等待退出代碼
- 11. 等待PID退出使用AppleScript
- 12. 進程結束等待退出
- 13. 非阻塞等待子進程退出
- 14. 如何等待窗口退出事件?
- 15. 爲什麼要等待退出?
- 16. 等待退出的Grunt任務
- 17. Perl,等待非子進程退出
- 18. 塊事件等待當進程退出
- 19. C#等待外部PID退出
- 20. 停止等待MQGET正常退出
- 21. 設置等待時間進程退出
- 22. 執行退出時命中等待DownloadStringTaskAsync
- 23. 的Java,等待子進程退出
- 24. 等待client.GetStringAsync退出無一例外
- 25. 的Process.Start等待Excel以退出錯誤
- 26. 如何等待演員中的用戶輸入?
- 27. 停止的演員實例,並等待其停止
- 28. 如何最好地實現阻塞/等待的演員?
- 29. 如何等待阿卡演員在測試中啓動?
- 30. Akka演員仍在等待新消息時工作?
我可以COUNTDOWN()之前退出()並只計爲1.這似乎是多餘的,因爲這兩種方法總是一起調用。 – 2010-06-24 04:50:40
我不明白。你想讓主線等到演員完成,對嗎?這就是'await()'調用的功能。 – 2010-06-24 04:59:52
這意味着我必須爲生產代碼(演員)添加一個閂鎖或條件,純粹用於JUnit測試(等待Actor)。 – 2010-06-24 05:06:41