Ожидайте Агента для выхода ()

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

13
задан Craig P. Motlin 24 June 2010 в 04:40
поделиться

2 ответа

В Specs вы можете использовать Eventually 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
2
ответ дан 2 December 2019 в 01:31
поделиться

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

latch.countDown()

и в основном потоке do

latch.await()

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

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

if (conditionSatisfied)
  condition.signal()

, а в основном потоке выполните

while (!conditionSatisfied)
 condition.await()

, чтобы заставить его ждать, пока условие не будет выполнено.

Подробности см. В документации javadocs CountDownLatch и Condition .

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

7
ответ дан 2 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: