Отправка сообщения в TestProbe () иногда завершается с ошибкой ActorInitializationException - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть некоторые спорадические неудачи испытаний, и я не могу понять, почему. У меня есть куча актеров, которые на работу, которую я хочу проверить. В начале теста я передаю ссылку на актера, которую я получаю из 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

В любом случае, я пока пытаюсь еще больше изолировать проблему. Спасибо за любую подсказку / идею.

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Хорошо, почти наверняка нашел проблему =). У TestProbes есть тайм-аут: когда через 5 секунд ничего не происходит, они сами останавливаются.

Теперь, к сожалению, тестирование занимает чуть более 5 секунд: в это время тестовый зонд может полностью прекратить работу, что приводит к провалу теста.

Исправить это легко, увеличьте время ожидания на TestProbe:

  val errorHandler = ignoreConnectionMsgProbe()
  errorHandler.setTestActorTimeout(20.seconds)
1 голос
/ 08 декабря 2011

Вы не начинаете свой актер здесь.Я не уверен, почему ваш тест работает иногда.В приведенном выше коде необходимо изменить следующую строку на .start()

val myStuffUnderTest = Actor.actorOf(new ComplexActor(eventListener.ref)).start();
...