在akka钩子中创建测试演员(preStart)

时间:2015-03-05 20:33:53

标签: scala tdd akka scalatest

我想测试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已接近我正在寻找的内容。但我认为改变代码因为测试原因是个坏主意。

也许有人知道更好的解决方案。

2 个答案:

答案 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)
   }
}