我想测试preStart()创建正确的actor树(纠正我,如果我选择了错误的地方来创建actor树)。
class Central extends Actor {
var summer : ActorRef = _
override def preStart() = {
val printerProps = Props[Printer]
val printer = context.actorOf(printerProps, "printer")
val summerProps = Props(new Summer(printer))
summer = context.actorOf(summerProps, "summer")
}
override def receive = {
case msg =>
}
}
全文:
class Printer extends Actor {
override def receive = {
case msg => println(msg)
}
}
class Summer(printer: ActorRef) extends Actor {
override def receive = {
case (x: Int, y: Int) =>
printer ! x + y
}
}
任何想法,如何明确测试它?
这个答案https://stackoverflow.com/a/18877040/1768378已接近我正在寻找的内容。但我认为改变代码因为测试原因是个坏主意。
也许有人知道更好的解决方案。
答案 0 :(得分:1)
如果您只想测试创建,您还可以从测试中获取一个ActorSelection,其中包含Central actor(central / *)的所有子项。
之后,向整个选择发送Identify消息(特殊akka消息)并等待响应,检查它们是否匹配。无需在演员中注入代码。
答案 1 :(得分:0)
基于Diego Martinoia回答的片段:
"The Central actor" should {
"Create Summer" in {
import scala.concurrent.duration._
implicit val timeout = Timeout(3 seconds)
val central = system.actorOf(Props[Central], "central")
val summerSelection = system.actorSelection("user/central/summer")
val summerRef = Await.result(summerSelection.resolveOne(), 3 seconds)
}
}