2017-08-03 1 views
0

J'essaie de tester ma logique d'acteur avec AkkaTestKit. Le problème est que mon acteur utilise le modèle ask. Donc j'ai besoin de répondre d'une manière ou d'une autre. Il semble que cela:Réponse ask in AkkaTestKit

case class AskExecution(id: Long) 

    override def receive: Receive = { 
    case id : Long => 
     implicit val dispatcher = context.dispatcher 
     implicit val timeout = Timeout(10 seconds) 
     val executor = sender 

     //How to answer this? 
     val f = executor ? AskExecution(id) map(v => v.asInstanceOf[Option[Long]]) 
     f.onComplete{ 
     case Success(k) => 
     case Failure(_) => 
     } 
    } 

Dans l'essai, je l'utilise comme suit:

val ca = TestActorRef(new TheActor()) 
ca ! 0L //I send 0, Now I want to answer the ask 
     //How to do so? 

Répondre

1

Pour rendre votre code plus facile à tester, donner votre acteur une référence à l'acteur exécuteur testamentaire (l'acteur qui gère la Message AskExecution).

import akka.pattern.pipe 

class TheActor(executor: ActorRef) extends Actor { 
    def receive = { 
    case id: Long => 
     val s = sender 
     implicit val dispatcher = context.dispatcher 
     implicit val timeout = 10.seconds 
     (executor ? AskExecution(id)).mapTo[Option[Long]].pipeTo(s) 
} 

class Executor extends Actor { 
    def receive = { 
    case AskExecution(id) => 
     // do something to get a result 
     val result: Option[Long] = ??? 
     sender ! result 
    } 
} 

Pour test, en supposant que votre classe de test étend TestKit et mélanges dans le trait ImplicitSender:

val executor = system.actorOf(Props[Executor]) 
val theActor = system.actorOf(Props(classOf[TheActor], executor)) 

within(10.seconds) { 
    theActor ! 0L 
    expectMsgClass(classOf[Option[Long]]) 
} 

// test the executor directly 
within(10.seconds) { 
    executor ! AskExecution(3L) 
    expectMsgClass(classOf[Option[Long]]) 
} 
+0

Il est encore plus facile d'injecter un 'TestProbe' et l'utiliser pour vérifier que les messages ont été envoyés et répondre pour eux. Pas besoin de créer une nouvelle classe d'acteur, et particulièrement utile si le comportement d'un autre acteur dépend de l'état. –