2017-08-03 1 views
0

Ich versuche meine Akteur Logik mit AkkaTestKit zu testen. Das Problem ist, dass mein Schauspieler ask Muster verwendet. Also muss ich irgendwie antworten. Es sieht wie folgt aus:Antwort 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(_) => 
     } 
    } 

Im Test habe ich es wie folgt verwenden:

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

Antwort

1

Um Ihren Code einfacher machen ein Verweis auf den Testamentsvollstrecker Schauspieler zu testen, geben Sie Ihre Schauspieler (der Schauspieler, dass die Griffe AskExecution Nachricht).

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 
    } 
} 

Um test, erweitert Ihre Testklasse unter der Annahme TestKit und die Mischungen im ImplicitSender Merkmale:

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

Es ist sogar einfacher, eine 'TestProbe' zu ​​injizieren und es verwendet, um sicherzustellen, dass Nachrichten gesendet wurden und darauf zu reagieren zu ihnen. Es ist nicht notwendig, eine neue Akteursklasse zu erstellen, und besonders nützlich, wenn das Verhalten eines anderen Akteurs vom Zustand abhängt. –