actor内で特定のExceptionが投げられることをテストしたいときはEventFilterを使おう - akka

akka 2.3.13です

KillされたことをテストしたくなったのでググったらEventFilterなるものが出てきました。

Testing Actor Systems — Akka Documentation

なんとログを見て特定の例外ログが出ているかどうかを見るもののようです。ゴリ押してますね。 使い方は公式のとおりなので書くまでもないですが、下のように書けます。

import akka.testkit.EventFilter
import com.typesafe.config.ConfigFactory
 
implicit val system = ActorSystem("testsystem", ConfigFactory.parseString("""
  akka.loggers = ["akka.testkit.TestEventListener"]
  """))
try {
  val actor = system.actorOf(Props.empty)
  EventFilter[ActorKilledException](occurrences = 1) intercept {
    actor ! Kill
  }
} finally {
  shutdown(system)
}

ログの設定を設定ファイルでやりたい時はtest/resources/application.conf などでやればOKです。

TestProbeでも良い?

Killされたことがテストできたら最高だったのですが、よく考えたら止まっていることがわかればまあいい感じだと気づいたので Testing Actor Systems — Akka Documentationにあるように TestProbe経由でTerminatedを観測してやれば良さそうでした。

val p = TestProbe()
probe watch target
target ! Kill
probe.expectTerminated(target)