如何测试演员不会在Akka中终止

时间:2017-01-26 11:44:24

标签: akka

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

终止

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

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

谢谢:)

更新

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

行为正常但我的问题是我只能测试没有孩子的场景并终止自己。我找不到合适的断言来检查它是否还有孩子的时候没有被终止。

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

"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 个答案:

答案 0 :(得分: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")
  }

这只会检查,如果您收到消息,则不是Terminated,因此可能无法涵盖所有​​情况..