Подождите, пока актер не выйдет () - PullRequest
13 голосов
/ 24 июня 2010

Как мне ждать выхода Scala Actor ()? Я настроил двух актеров в модульном тесте и отправил несколько сообщений, чтобы они начали. Они отправляют несколько сообщений взад и вперед и в итоге оба вызывают exit (). Как заставить мой модульный тест подождать, пока оба актера закончат, прежде чем пройти?

Ответы [ 2 ]

7 голосов
/ 24 июня 2010

Если вы заранее знаете количество сообщений, которыми обмениваются актеры, вы можете использовать java.util.concurrent.CountDownLatch для отслеживания количества сообщений. В актерах после каждой обработки сообщения делай

latch.countDown()

и в своей основной теме делай

latch.await()

Это заставит ваш главный поток подождать, пока счетчик защелки не уменьшится до нуля.

Если вы не знаете заранее количество сообщений, но у вас есть условие, которое указывает на финиш, вы можете использовать java.util.concurrent.locks.Condition. В актерах, когда ваше состояние выполнено, выполните

if (conditionSatisfied)
  condition.signal()

и в своей основной теме делайте

while (!conditionSatisfied)
 condition.await()

чтобы он дождался выполнения условия.

Подробнее см. В javadocs CountDownLatch и Condition.

См. этот Gist для примера использования Condition.

2 голосов
/ 24 июня 2010

В спецификациях вы можете использовать В конечном итоге совпадения . Если вам известно конечное состояние вашего субъекта или любого объекта (например, хранилища постоянных данных), которое он изменяет, вы можете заставить тест ждать, пока не произойдет переключение в это состояние:

<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
...