【问题标题】:How to test an actor is not terminated in Akka如何在 Akka 中测试演员没有终止
【发布时间】:2017-01-27 15:16:02
【问题描述】:

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

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

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

谢谢:)

更新

在我的场景中,我有一个用户actor,它有一个或多个子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?
}

【问题讨论】:

    标签: akka


    【解决方案1】:

    从 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,因此它可能不会涵盖所有场景..

    【讨论】:

    • 看起来很有希望,但我无法让它发挥作用。 receiveOne 总是返回 null。我会尝试不同的方法,看看是否可行。如果有帮助,我也更新了我的问题,谢谢!
    • 如果返回 null,则表示在提供的max 持续时间内没有收到Terminated 消息。因此 - 我会假设 - 你的测试已经通过了。
    • 问题是receiveOne总是返回null,不管actor是否被终止。但我觉得这是正确的方向,我会在以后做更多的测试。
    猜你喜欢
    • 2018-04-20
    • 2014-03-09
    • 2014-07-11
    • 2016-02-03
    • 2018-12-15
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多