Monday, February 10, 2014

Akka: Testing messages sent to an actor's parent

I've blogged previously about testing messages sent back to the sender and to a child actor. The final common scenario I come across is testing actors that send a messages back to its supervisor/parent. If it is in response to a message from the parent you can use the same technique as described in testing messages sent back to the sender.

However, if that is not the case then TestKit has a very simple way you can do it with the TestActorRef and a TestProbe. Any where you have a piece of code that looks like this:

context.parent ! "Any message"

For example:

class ChildActor extends Actor {
def receive: Actor.Receive = {
case "Do something" => {
// Do something important
context.parent ! "I was told to do something and I did it"
}
}
}
Then you can test it by passing a TestProbe to your TestActorRef and using the expect* functions on the TestProbe. So to test the actor above your test will look something like this:

class ChildActorTest extends TestKit(ActorSystem("ChildActorTest")) with FunSuiteLike with ShouldMatchers {
test("Should inform parent when told to do something") {
val parent = TestProbe()
val underTest = TestActorRef(Props[ChildActor], parent.ref, "ChildActor")
underTest ! "Do something"
parent.expectMsg("I was told to do something and I did it")
}
}
As you can see the TestActorRef can take an ActorRef to use as a parent when you use the apply method that takes in a Props.

Full code here. Happy testing.

3 comments:

Unknown said...

Thanks, this helped a lot. I am using Java, but still I was able to test my parent/child.

Nicola Piccinini said...

thanks, really helpful

Anonymous said...

Thanks heaps for sharing that. I was scratching my head as to why sender ! Message worked but couldn't get the parent ! Message test working.