J'ai quelques échecs de test sporadiques et je n'arrive pas à comprendre pourquoi. J'ai un tas d'acteurs qui pour le travail que je veux tester. Au début du test je passe dans une référence d'acteur que je reçois d'une TestProbe(). Plus tard, le groupe d'acteurs fait un travail et envoie le résultat à la référence de l'acteur de la sonde de test donnée. Ensuite, je vérifie le résultat avec TestProbe():L'envoi d'un message à TestProbe() échoue parfois avec ActorInitializationException
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")
}
}
}
De temps à autre, le test échoue. Et quand je regarde à travers la trace de la pile, je vois que j'ai une 'ActorInitializationException' lors de l'envoi d'un message à l'acteur de la sonde de test. Cependant, à aucun moment j'arrête l'acteur TestProbe.
est ici l'exception:
[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)
....
Je me demande si je me manque quelque chose d'évident ou suis-je faire une erreur subtile? Ou peut-être que quelque chose ne va vraiment pas dans mon code et que je ne peux pas le voir?
Je suis sur Akka 1.2.
Mise à jour pour Vitores-Comment. A la ligne 125, j'envoie un message à un acteur avec le! -operator. Maintenant dans le test-setup c'est la référence d'acteur TestProbe. Et je ne peux pas comprendre pourquoi parfois l'acteur TestProbe semble être arrêté.
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
De toute façon, j'essaie d'isoler le problème pour le moment. Merci pour tout indice/idée.
Pourquoi ne vous inclus la section la plus intéressante? atkka.mobile.client.RemoteMessaging $ RemoteMessagingSupervision $$ anonfun $ receive $ 1.apply (RemoteMessaging.scala: 125) –
À 125 j'envoie un message à mon acteur TestProbe(): Je n'arrive pas à comprendre pourquoi la sonde de test l'acteur ne court pas parfois et je reçois l'exception. – Gamlor