等待Actor退出()

时间:2010-06-24 04:40:26

标签: unit-testing scala concurrency actor

如何等待Scala Actor退出()?我在单元测试中设置了两个Actors,并发送一些消息以启动它们。他们来回发送一些消息,最终都调用exit()。如何使我的单元测试等待两个演员在通过之前完成?

2 个答案:

答案 0 :(得分:7)

如果事先知道演员之间交换的消息数量,您可以使用java.util.concurrent.CountDownLatch来跟踪消息的数量。在演员中,在每次处理消息后,执行

latch.countDown()

并在主线程中执行

latch.await()

这将使您的主线程等待,直到锁存器的计数降至零。

如果您事先不知道消息的数量,但有条件表明结束,那么您可以使用java.util.concurrent.locks.Condition。在演员中,当你的条件满足时,做

if (conditionSatisfied)
  condition.signal()

并在主线程中执行

while (!conditionSatisfied)
 condition.await()

让它等到条件满足。

有关详细信息,请参阅CountDownLatchCondition的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