Akka: Test scheduled actors using Testkit

475 views Asked by At

I have a parent actor which creates a child actor and the child actor greets parent every minute as below

    class MasterActor extends Actor with ActorLogging {

     override def receive: Receive = {
       case "Greet" =>
         print("Hey child!!")
       case "CreateChild" =>
        context.actorOf(Props[ChildActor])
      }
    }

    class ChildActor extends Actor with ActorLogging {

    import context.dispatcher

    override def preStart(): Unit = {
      super.preStart()
      context.system.scheduler.schedule(Duration("1 minutes").asInstanceOf[FiniteDuration],
        Duration("1 minutes").asInstanceOf[FiniteDuration], context.parent, "Greet")
    }

    override def receive: Receive = {
      case _ =>
        print("child receives something")
      }
    }

I am new to actor system, How can I test schedule scenario using TestKit?

I tried something like below in my test but that is not working

    "Master actor" should {
     "receive a Greet message every minute" in {
      val probe = TestProbe

      val actor = system.actorOf(Props(new Child() {

        import context.dispatcher

        override def preStart() =
          context.system.scheduler.scheduleOnce(Duration("1 seconds").asInstanceOf[FiniteDuration], probe.ref, "Greet")
      }))

      probe.expectMsg("Greet")
     }
    }
1

There are 1 answers

0
Tomer Shetah On

You can read about it at the timing-assertions section in the testing of akka docs. There is the within function that should help you.

For example you can try:

"Master actor" should {
 "receive a Greet message every minute" in {
   within(62 seconds) {
    val probe = TestProbe

    val actor = system.actorOf(Props[Child])
    probe.expectMsg("Greet")
  }
 }
}

What I would do, not to wait so long, is putting the delay timeout in the configuration, and change it to a few millis in the test scenario.