【问题标题】:How can I make my local actor more testable?我怎样才能让我的本地演员更容易测试?
【发布时间】:2017-04-13 09:53:13
【问题描述】:

我有一个大致如下所示的演员系统:

class LocalActor extends Actor {

  // create the remote actor
  val remoteActor = context.actorSelection("akka.tcp://RemoteSystem@127.0.0.1:2552/user/RemoteActor")

  def receive = {
    case foo: String => remoteActor ! s"foo = ${foo}"
    case bar: Int => remoteActor ! s"bar = ${bar}"
    case _ => remoteActor ! "No clue..."
  }
}

我想重构它,这样remoteActor 的 TCP/IP 就不会被硬编码。最简单的更改是将其显式传递给构造函数:

class LocalActor(TcpIp: String) extends Actor {

    val remoteActor = context.actorSelection(TcpIp)
    // ...
}

但我担心如果 TCP/IP 地址已在使用中,这可能会导致问题。对我来说最有意义的选项是将参与者(或引用或类似的)传递给构造函数——在 Akka 中是否有一种惯用的方式来做到这一点?

我有点困惑,因为remoteActor 的类型是akka.actor.ActorSelection,我可能预计它是ActorActorRef

幸运的是,远程参与者只与sender 交互,所以它的方式很好;但是本地演员还是很棘手的。

如果我上面的想法不是一个好的想法,那么让这个更通用和可测试的传统方法是什么?

【问题讨论】:

    标签: scala unit-testing refactoring akka


    【解决方案1】:

    实现此目的的一种方法是直接将引用传递给您的演员类:

    object LocalActor {
      def prop(remoteActor: ActorRef) = Props(new LocalActor(remoteActor))
    }
    
    class LocalActor(remoteActor: ActorRef) extends Actor {
      def receive = {
        case foo: String => remoteActor ! s"foo = ${foo}"
        case bar: Int => remoteActor ! s"bar = ${bar}"
        case _ => remoteActor ! "No clue..."
      }
    }
    

    然后,无论您在哪里创建 LocalActor,您还可以通过解析 actorSelection 来创建对 remoteActor 的引用:

    val system = ActorSystem("yourSystem")
    implicit val resolveTimeout = Timeout(5 seconds)
    val remoteActor = Await.result(system.actorSelection("akka.tcp://RemoteSystem@127.0.0.1:2552/user/RemoteActor").resolveOne(), resolveTimeout.duration)
    val localActor = system.actorOf(LocalActor.props(remoteActor), "LocalActor")
    

    那么为了测试你只需要注入一个TestProbe:

    val testProbe = TestProbe()
    val testingLocalActor = system.actorOf(LocalActor.props(testProbe.ref))
    val testString = "TEST"
    testingLocalActor ! testString
    testProbe.expectMsg(s"foo = $testString")
    

    【讨论】:

    • TestProbe 太棒了!干杯。
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2023-03-27
    • 2017-09-07
    相关资源
    最近更新 更多