如何等待Scala Actor退出()?我在单元测试中设置了两个Actors,并发送一些消息以启动它们。他们来回发送一些消息,最终都调用exit()。如何使我的单元测试等待两个演员在通过之前完成?
答案 0 :(得分:7)
如果事先知道演员之间交换的消息数量,您可以使用java.util.concurrent.CountDownLatch
来跟踪消息的数量。在演员中,在每次处理消息后,执行
latch.countDown()
并在主线程中执行
latch.await()
这将使您的主线程等待,直到锁存器的计数降至零。
如果您事先不知道消息的数量,但有条件表明结束,那么您可以使用java.util.concurrent.locks.Condition
。在演员中,当你的条件满足时,做
if (conditionSatisfied)
condition.signal()
并在主线程中执行
while (!conditionSatisfied)
condition.await()
让它等到条件满足。
有关详细信息,请参阅CountDownLatch
和Condition
的javadoc。
有关使用Condition
的详细信息,请参阅this Gist。
答案 1 :(得分:2)
在规格中,您可以使用Eventually Matchers。如果您知道您的actor或任何实体(例如,持久性存储)的最终状态,它会修改,您可以强制测试等待,直到切换到此状态:
<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