Подождите, пока актер выйдет()

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

Ответы

Ответ 1

Если вы заранее знаете количество сообщений, обмениваемых между участниками, вы можете использовать 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

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

<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