Akka Scala TestKit测试PoisonPill消息

时间:2016-01-26 14:13:01

标签: scala testing akka testkit

鉴于我有一个注射了Supervisor actor的child actor,如何向孩子发送PoisonPill消息并使用TestKit对其进行测试?

这是我的Superivisor。

class Supervisor(child: ActorRef) extends Actor {

  ...
  child ! "hello"
  child ! PoisonPill
}

这是我的测试代码

val probe = TestProbe()
val supervisor = system.actorOf(Props(classOf[Supervisor], probe.ref))
probe.expectMsg("hello")
probe.expectMsg(PoisonPill)

问题是未收到PoisonPill消息。 可能是因为探测被PoisonPill消息终止了?

断言以

失败
java.lang.AssertionError: assertion failed: timeout (3 seconds) 
during expectMsg while waiting for PoisonPill

2 个答案:

答案 0 :(得分:4)

我认为Testing Actor Systems应该回答你的问题:

从探针中观看其他演员

TestProbe可以为任何其他演员的DeathWatch注册自己:

val probe = TestProbe()
probe watch target
target ! PoisonPill
probe.expectTerminated(target)

答案 1 :(得分:1)

在扩展testkit的测试用例中,您可以使用以下代码:

"receives ShutDown" must {
  "sends PosionPill to other actor" in {
    val other = TestProbe("Other")
    val testee = TestActorRef(new Testee(actor.ref))

    testee ! Testee.ShutDown

    watch(other.ref)
    expectTerminated(other.ref)
  }
}