Skip to content

Instantly share code, notes, and snippets.

@TJC
Created July 10, 2020 04:45
Show Gist options
  • Save TJC/b64ed88634d7e6474fa14436cff0b1a1 to your computer and use it in GitHub Desktop.
Save TJC/b64ed88634d7e6474fa14436cff0b1a1 to your computer and use it in GitHub Desktop.
How to test Akka Actor has stopped, when using scheduler?
import java.util.concurrent.TimeUnit
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.{Behaviors, TimerScheduler}
import scala.concurrent.duration._
class ButterflyActor(
timers: TimerScheduler[TriggerMessage],
) {
def initialState() = {
scheduleTrigger(10.seconds)
Behaviors.receiveMessage[TriggerMessage] { _ =>
Behaviors.stopped
}
}
private def scheduleTrigger(delay: Long): Unit = {
val delayDuration = FiniteDuration(delay, TimeUnit.MILLISECONDS)
timers.startSingleTimer(TriggerMessage(), delayDuration)
}
}
case class TriggerMessage()
object ButterflyActor {
def apply = {
Behaviors.setup { context =>
Behaviors.withTimers { timers =>
new ButterflyActor(timers).initialState()
}
}
}
}
import akka.actor.testkit.typed.scaladsl.{ManualTime, ScalaTestWithActorTestKit}
import org.scalatest.funspec.AnyFunSpecLike
import org.scalatest.matchers.should.Matchers
import org.scalamock.scalatest.MockFactory
import scala.concurrent.duration._
class DelayedMessagingActorSpec
extends ScalaTestWithActorTestKit(ManualTime.config)
with AnyFunSpecLike
with Matchers
{
val manualTime: ManualTime = ManualTime()
it("stops after 10 seconds") {
val actor = testKit.spawn(ButterflyActor())
manualTime.timePasses(10.seconds)
// TODO: How do we check it stopped?
}
}
@TJC
Copy link
Author

TJC commented Jul 10, 2020

Answer: Use TestProbes

val actor = testKit.spawn(ButterflyActor())
val probe = testKit.createTestProbe()
manualTime.timePasses(10.seconds)
probe.expectTerminated(actor, 10.millis)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment