13

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

4

2 回答 2

7

如果您事先知道参与者之间交换的消息数量,则可以使用 ajava.util.concurrent.CountDownLatch来跟踪消息数量。在actors中,每次处理完消息后,做

latch.countDown()

在你的主线程中做

latch.await()

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

如果您事先不知道消息的数量,但有一个指示完成的条件,那么您可以使用java.util.concurrent.locks.Condition. 在演员中,当你的条件满足时,做

if (conditionSatisfied)
  condition.signal()

在你的主线程中做

while (!conditionSatisfied)
 condition.await()

让它等到条件满足。

CountDownLatch有关详细信息,请参阅和的 javadocs Condition

有关使用的示例,请参见此要点Condition

于 2010-06-24T04:45:31.653 回答
2

在 Specs 中,您可以使用Ultimate 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
于 2010-06-24T10:29:29.840 回答