有时使用ActorInitializationException将消息发送到TestProbe()会失败

时间:2011-12-08 13:44:53

标签: scala akka

我有一些零星的测试失败并且很难找出原因。我有很多演员要参加我要测试的作品。在测试开始时,我传入了一个我从TestProbe()获得的actor参考。稍后,演员组会做一些工作并将结果发送到给定的测试探针actor参考。然后我用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")
        }

    }
}

现在偶尔测试失败了。当我查看堆栈跟踪时,我发现在向测试探针actor发送消息时我得到了一个'ActorInitializationException'。但是,在任何时候我都不会停止TestProbe actor。

以下是例外:

[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)
....

我想知道我是否遗漏了一些明显的东西,或者我是否犯了一个微妙的错误?或者在我的代码中可能出现了什么问题,我看不到它?

我在Akka 1.2上。

Vitors更新 - 评论。在第125行,我使用!-operator向一个演员发送消息。现在在测试设置中,这是TestProbe actor-reference。我无法弄清楚为什么有时候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 个答案:

答案 0 :(得分:1)

你不是在这里开始你的演员。我不确定为什么你的测试在某些时候有效。上面的代码需要使用.start()

修改以下行
val myStuffUnderTest = Actor.actorOf(new ComplexActor(eventListener.ref)).start();

答案 1 :(得分:1)

好的,几乎可以肯定发现了这个问题=)。 TestProbes确实有一个超时:当5秒后没有任何反应时,他们会自行阻止它们。

现在不幸的是,测试只需要5秒钟的时间:在那段时间内,测试探针可能会自行停止,然后导致测试失败。

修复它很容易,增加TestProbe的超时时间:

  val errorHandler = ignoreConnectionMsgProbe()
  errorHandler.setTestActorTimeout(20.seconds)