Sto usando ScalaTest con Akka TestKit per scrivere test di unità e integrazione per un attore che ho codificato semplicemente per inviare un messaggio a un altro attore senza mutare nessuno stato interno. Prendete questo esempio:Come si verifica un attore Akka che invia un messaggio a un altro attore?
class MyActor extends Actor {
val anotherActor = context.actorOf(Props[AnotherActor])
def receive: Receive = {
case MyMessage => anotherActor ! AnotherMessage
}
}
Voglio scrivere un test che conferma che anotherActor
elaborato AnotherMessage
come conseguenza della trasformazione MyActor
MyMessage
. L'esempio classico è quello di utilizzare TestActorRef
per arrivare al l'attore sottostante e verificare la presenza di qualche stato interno che avrebbe dovuto essere colpiti al momento della ricezione messaggio in questo modo:
val testActorRef = TestActorRef(new MyActor)
"MyActor" should "change some internal state when it receives MyMessage" in {
testActorRef ! MyMessage
testActorRef.underlyingActor.someState shouldBe "altered"
}
Ma nel mio caso io non mi importa di tale stato. In realtà, voglio evitare di tenere qualsiasi stato del genere. TestProbe
non era esattamente quello che stavo cercando, dal momento che devi ancora registrare uno TestProbe.ref
con l'attore in prova. Per la maggior parte, ho esaminato tutti gli esempi nella documentazione di Akka sui test (http://doc.akka.io/docs/akka/snapshot/scala/testing.html) ma non ho trovato nulla di adatto.
Esattamente quello che stavo cercando! Non ho nemmeno pensato di creare attori bambini con un metodo che potrei semplicemente ignorare per inserire il 'TestProbe.ref'. Grazie @cmbaxter, – nmurthy
Come facciamo questo se abbiamo un altro attore creato all'interno del metodo di ricezione? –
Come potrebbe essere implementato in Java? –