如何测试在运行时产生子actor的Akka actor?

时间:2016-10-18 05:25:08

标签: scala testing akka

other question之后,我有一个UDP服务器角色如下:

class Listener(addr: InetSocketAddress) extends Actor {
  import context.system
  IO(Udp) ! Udp.Bind(self, addr)

  def spawnChild(remote): ActorRef = {
    //Check if child already exist
    context.actorOf(Props[Worker])
  }

  def receive = {
    case Udp.Bound(local) =>
      context.become(ready(sender()))
  }

  def ready(socket: ActorRef): Receive = {
    case Udp.Received(data, remote) =>
      val worker = spawnChild(remote)
      worker ! data // forward data directly to child
    case Udp.Unbind  => socket ! Udp.Unbind
    case Udp.Unbound => context.stop(self)
  }
}

我根据数据发送的位置创建子actor。这样做的原因是由儿童演员保持一些内部状态。内部状态包括上次连接时间,发送的数据包总数等

我想设置TestProbes来测试

    来自remoteA的
  • 数据被转发到TestProbeA
  • 来自remoteB的
  • 数据被转发到TestProbeB
  • 来自remoteA的数据不会转发到TestProbeB

我已阅读Using multiple probes部分。但在我的情况下,负责创建孩子的是父演员。

在这种情况下我应该如何编写我的规格?或许,我应该如何重构我的代码以使其更适合测试?

1 个答案:

答案 0 :(得分:2)

akka文档中有一节概述了可以实现的几种方法:Testing parent child relationships

在工作中,我们已成功使用从父母进行外部化制作中解释的方法。在实践中,这意味着你的父母扮演一个儿童工厂"参数在初始化时(或通过消息)。

在测试代码中,你可以提供一个"假的"工厂将返回测试探针而不是纯粹的演员。