Мое приложение использует актер Supervisor akka, который внутренне инициализировал других актеров (потомков). Однако, поскольку это происходит асинхронно, у меня возникают проблемы при попытке написать тесты с помощью Akka TestKit.
Например, когда я пытаюсь проверить, как система завершается из другой системы, отправив сообщение дочернему актору супервизора, я создаю новую систему акторов, а затем с actorOf супервизора, который получает конфигурацию (используется для создать дочерних актеров внутри супервизора), например:
val anotherSystem: ActorSystem = ActorSystem("anotherSystem")
anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
Затем, если я пытаюсь отправить сообщение дочернему актору в AnotherSupervisor
с помощью actorSelection, оно завершается неудачей, поскольку дочерний актер еще не selectable
:
anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver") ! message
expectMsg(Ack)
Сбой, поскольку AnotherManagementReceiver
еще не создано.
Использование Thread.sleep(5000)
работает, но это просто ужасно.
После поиска возможных решений я протестировал:
anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver").resolveOne() ! message
Также не работает с существующим сообщением актера.
Также попытался EventFilter, чтобы дочерний актер получил что-то в журнале:
EventFilter.info("Management consumer started", occurrences = 1) intercept {
anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
}
И это ждет до истечения времени ожидания (я даже вижу сообщение журнала), но я предполагаю, что EventFilter читает только из "основной" системы акторов, созданной TestKit.
Есть идеи или предложения по поводу этого сценария?