在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来测试
我已阅读Using multiple probes部分。但在我的情况下,负责创建孩子的是父演员。
在这种情况下我应该如何编写我的规格?或许,我应该如何重构我的代码以使其更适合测试?
答案 0 :(得分:2)
akka文档中有一节概述了可以实现的几种方法:Testing parent child relationships
在工作中,我们已成功使用从父母进行外部化制作中解释的方法。在实践中,这意味着你的父母扮演一个儿童工厂"参数在初始化时(或通过消息)。
在测试代码中,你可以提供一个"假的"工厂将返回测试探针而不是纯粹的演员。