如何测试Akka Actor是否已终止

5

我正在尝试测试演员是否已终止,我知道可以使用TestProbe的expectTerminated来测试它是否已终止。

http://doc.akka.io/docs/akka/2.4.16/scala/testing.html#Watching_Other_Actors_from_Probes

但是是否有一种方法来测试相反的情况呢?

谢谢 :)

更新

在我的场景中,我有一个用户演员,它有一个或多个子演员,并且在所有子演员断开连接(终止)时将自己终止。

这个行为很好用,但我的问题是我只能测试没有孩子剩下并终止自身的情况。我找不到正确的断言来检查如果它仍然有孩子留下,它没有被终止。

以下是简化的测试版本:

"Terminates itself if there are no connected clients" in {
  val userActor = system.ActorOf(UserActor.props())

  userActor ! UserActor.ClientDisconnected()

  val deathWatch = TestProbe()
  deathWatch.watch(userActor)
  deathWatch.expectTerminated(userActor, timeoutDuration)
}

"Not Terminates itself when there are still other clients connected" in {
  val userActor = system.ActorOf(UserActor.props())

  // Connecting a client
  userActor ! UserActor.ClientConnected(sessionId, accessToken)

  userActor ! UserActor.ClientDisconnected()

  // How can I test that userActor is not terminated?
}
1个回答

1
从测试工具中汲取灵感,你可以做以下操作:
  import scala.concurrent.duration._
  import akka.testkit._

  def expectNoTerminated(target: ActorRef, max: FiniteDuration) {
    val o = receiveOne(max.dilated)

    if (o ne null)
      assert(o != Terminated(target), s"received Terminated message $o")
  }

这将仅检查您是否收到了消息,而不是已终止,因此可能无法涵盖所有情况..

看起来很有前途,但我无法让它工作。receiveOne 总是返回 null。我会尝试不同的方法,看看是否有效。另外,如果有帮助的话,我已经更新了我的问题,谢谢! - Soroush Mirzaei
如果返回 null,则表示在提供的最大持续时间内未收到“Terminated”消息。因此 - 我会假设 - 您的测试已通过。 - Stefano Bonetti
问题在于receiveOne始终返回null,无论actor是否已终止。但我感觉这是正确的方向,稍后会进行更多测试。 - Soroush Mirzaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接