Как я ожидаю Агента Scala для выхода ()? Я настроил двух Агентов в модульном тесте и отправляю несколько сообщений для запущения их. Они отправляют несколько сообщений назад и вперед и в конечном счете оба выхода вызова (). Как я заставляю свой модульный тест ожидать обоих Агентов для завершения перед передачей?
В 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
Если вы заранее знаете количество сообщениями, которыми обмениваются акторы, вы можете использовать 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
.