Как ждать, пока все актеры обработают свои входящие сообщения в тесте - PullRequest
0 голосов
/ 13 апреля 2019

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

Поскольку субъект может изменять только свое внутреннее состояние, а не передавать сигнал извнеМир, в котором сообщение было получено, я должен найти другой способ ждать, пока сообщение не будет обработано.

Есть ли способ подождать, пока все входящие ящики будут пустыми?Я думаю, что ManualTime.timePasses(0.seconds) может выполнить эту работу, но я не уверен, и это значительно замедляет мои тесты.Очевидно, я не хочу использовать Thread.sleep(...), потому что это не гарантирует, что все сообщения будут обработаны, а тесты будут еще медленнее.

Я также пытался использовать BehaviorInterceptor, чтобы выяснить, когдаГлавный актер получил сообщение, но это возможно только тогда, когда я знаю, какие сообщения дочерние актеры отправляют главному актеру.На самом деле это должно быть прозрачно в тесте, поэтому я ищу общий способ утверждать, что актеры закончили с обработкой сообщений (так как я управляю планировщиком, сообщения таймера не генерируются).

1 Ответ

0 голосов
/ 14 апреля 2019

Я обнаружил, что на самом деле это довольно легко сделать: A CallingThreadDispatcher обрабатывает все сообщения актера немедленно, а доставка и обработка сообщений детерминирована.Никогда не нужно ждать обработки сообщений, потому что они обрабатываются в тестовом потоке, прежде чем вызов tell (или !) вернется.

Вы можете настроить его для своей системы актера-испытателя, например, в Akka Тип:

val config = ConfigFactory.parseString(
    """akka.actor.default-dispatcher =
        { type = akka.testkit.CallingThreadDispatcherConfigurator }"""
)

val testKit = ActorTestKit(ActorTestKitBase.testNameFromCallStack(), config)
...