Ich benutze ScalaTest mit dem Akka TestKit, um Einheits- und Integrationstests für einen Akteur zu schreiben, den ich codiert habe, um einfach eine Nachricht an einen anderen Akteur zu senden, ohne einen internen Zustand zu verändern. Nehmen Sie dies zum Beispiel:Wie teste ich einen Akka-Schauspieler, der eine Nachricht an einen anderen Schauspieler sendet?
class MyActor extends Actor {
val anotherActor = context.actorOf(Props[AnotherActor])
def receive: Receive = {
case MyMessage => anotherActor ! AnotherMessage
}
}
ich einen Test schreiben möchten, die bestätigt, dass anotherActor
AnotherMessage
als Folge der MyActor
Verarbeitung MyMessage
verarbeitet. Das klassische Beispiel ist TestActorRef
zu verwenden, bei dem zugrunde liegenden Schauspieler zu bekommen und für einige interne Zustand zu überprüfen, die wie so bei Empfang der Nachricht betroffen sind, sollten:
val testActorRef = TestActorRef(new MyActor)
"MyActor" should "change some internal state when it receives MyMessage" in {
testActorRef ! MyMessage
testActorRef.underlyingActor.someState shouldBe "altered"
}
Aber in meinem Fall habe ich kümmern sich nicht um solchen Zustand. Tatsächlich möchte ich vermeiden, einen solchen Staat zu halten. TestProbe
war nicht ganz das, wonach ich gesucht habe, da Sie immer noch einen TestProbe.ref
mit dem zu testenden Aktor registrieren müssen. Zum größten Teil habe ich alle Beispiele in der Akka-Dokumentation zum Testen (http://doc.akka.io/docs/akka/snapshot/scala/testing.html) betrachtet, aber nichts passendes gefunden.
Genau das, was ich gesucht habe! Ich habe nicht einmal daran gedacht, Kinderakteure mit einer Methode zu kreieren, die ich einfach außer Kraft setzen könnte, um sie in 'TestProbe.ref' fallen zu lassen. Danke @cmbaxter, – nmurthy
Wie machen wir das, wenn wir einen anderen Akteur innerhalb der Empfangsmethode haben? –
Wie könnte das in Java implementiert werden? –