akka - 如何在 Akka 中测试 Actor 未终止

标签 akka

我正在尝试测试 Actor 是否被终止,我知道有一种方法可以使用 TestProbe 的 expectTerminated 来测试它是否被终止。

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

但是有没有办法测试相反的情况?

谢谢 :)

更新

在我的场景中,我有一个用户 actor,它有一个或多个子 actor,当所有子 actor 都断开连接(终止)时,它会自行终止。

行为工作正常,但我的问题是我只能测试它没有 child 离开并自行终止的场景。我找不到正确的断言来检查它是否没有终止,如果它仍然有 child 。

这是一个简化的测试版本:

"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?
}

最佳答案

从 testkit 中汲取灵感,您可以执行以下操作:

  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")
  }

这只会检查,如果您收到一条消息,它不是 Terminated ,因此它可能无法涵盖所有​​场景..

关于akka - 如何在 Akka 中测试 Actor 未终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41872737/

相关文章:

java - sbt 运行正常但运行 jar 失败

scala - 如何在 SCALA 中将 Long 转换为 Duration(导入 scala.concurrent.duration)

scala - Akka Http返回404未找到

scala - 如何从Typesafe config配置系统属性或回退配置变量?

scala - Akka-Http 加载 css&js 资源

java - Akka远程actor部署文档错误

scala - Akka 远程角色,没有默认构造函数的父类(super class)

scala - 具有持久参与者的 Akka 分片的背压

java - ActorContext(getContext())可以在Actor外部传递来创建子actor吗?

scala - Akka:坚持到 Cassandra 并将多个事件发布到 Kafka