У меня есть некоторые спорадические неудачи испытаний, и я не могу понять, почему. У меня есть куча актеров, которые на работу, которую я хочу проверить. В начале теста я передаю ссылку на актера, которую я получаю из TestProbe (). Позже группа актеров выполняет некоторую работу и отправляет результат в заданную ссылку на актера тестового зонда. Затем я проверяю результат с помощью TestProbe ():
class MyCaseSpec extends Spec with ShouldMatchers{
describe("The Thingy"){
it("should work"){
val eventListener = TestProbe()
val myStuffUnderTest = Actor.actorOf(new ComplexActor(eventListener.ref)).start();
myStuffUnderTest ! "Start"
val eventMessage = eventListener.receiveOne(10.seconds).asInstanceOf[SomeEventMessage]
eventMessage.data should be ("Result")
}
}
}
Теперь время от времени тест не проходит. И когда я просматриваю трассировку стека, я вижу, что я получил «ActorInitializationException» при отправке сообщения актеру тестового зонда. Однако ни в коем случае я не останавливаю актера TestProbe.
Вот исключение:
[akka:event-driven:dispatcher:global-11] [LocalActorRef] Actor has not been started, you need to invoke 'actor.start()' before using it
akka.actor.ActorInitializationException: Actor has not been started, you need to invoke 'actor.start()' before using it
[Gamlor-Laptop_c15fdca0-219e-11e1-9579-001b7744104e]
at akka.actor.ScalaActorRef$class.$bang(ActorRef.scala:1399)
at akka.actor.LocalActorRef.$bang(ActorRef.scala:605)
at akka.mobile.client.RemoteMessaging$RemoteMessagingSupervision$$anonfun$receive$1.apply(RemoteMessaging.scala:125)
at akka.mobile.client.RemoteMessaging$RemoteMessagingSupervision$$anonfun$receive$1.apply(RemoteMessaging.scala:121)
at akka.actor.Actor$class.apply(Actor.scala:545)
....
Мне интересно, упускаю ли я что-то очевидное или я совершаю небольшую ошибку? Или, может быть, что-то действительно не так внутри моего кода, и я не вижу этого?
Я на Акке 1.2.
Обновление для Vitors-Comment. В строке 125 я отправляю сообщение актеру с! -Оператором. Теперь в тестовой настройке это ссылка на актера TestProbe. И я не могу понять, почему иногда актер TestProbe, кажется, останавливается.
protected def receive = {
case msg: MaximumNumberOfRestartsWithinTimeRangeReached => {
val lastException = msg.getLastExceptionCausingRestart
faultHandling ! ConnectionError(lastException, messages.toList, self) // < Line 125. The faultHandling is the TestProbe actor
become({
// Change to failure-state behavior
}
// Snip
В любом случае, я пока пытаюсь еще больше изолировать проблему. Спасибо за любую подсказку / идею.