测试孩子对akka的反应

时间:2014-11-03 20:03:08

标签: scala unit-testing akka

我很高兴在akka系统上使用scala。

我有一个父母演员(名为"经理"),它向孩子发送一条消息,并收到一个答案,然后转发给下一个孩子。 最终的演员保存了整个过程的结果。

我想创建一个端到端测试,它将消息发送给父(" manager"),并期望来自最后一个接收结果的actor的消息。 我正在寻找一种简单的方法来指导最终演员将消息发送回测试。由于测试不是发送者,并且它不是一个简单的演员,我不知道如何正确地指导消息。

以下是测试代码:

class EndToEndTest extends TestKit(ActorSystem("MyActorSystem"))
with FunSuiteLike with Matchers with BeforeAndAfterAll with ImplicitSender {

  override def afterAll {
      TestKit.shutdownActorSystem(system)
  }

  test("should send result") {

  val actor = system.actorOf(Props(new Manager(name = "ActorManager")))
  actor ! tPoint(1000L)
  actor ! tPoint(2000L)

  expectMsg(ActorResult(1)) 
  }
}

和最后一个儿童演员:

class SensorHealthReportMySqlActor extends Actor with ActorLogging {

   def receive = {
      case Result(result: Long) =>

         //this is where i would like to send the test a message with  Result(result)

      case _ =>
           log.error("Unknown message type")
   }

}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我认为您想要的解决方案是在消息中传递ActorRef作为参数,以便接收方知道在将消息发送给当前消息的发送方以外的某个角色时将回复发送到何处

这些内容如下:

import akka.actor.{Actor, Props, ActorRef, ActorLogging}

case class tPoint(n: Long)
case class Result(result: Long, replyTo: ActorRef)
case class ActorResult(result: Long)

class Manager(name: String) extends Actor {

  val child = context.actorOf(Props(new SensorHealthReportMySqlActor))

  override def receive: Receive = {
    case msg: tPoint ⇒
      child ! Result(msg.n, sender())
  }
}



class SensorHealthReportMySqlActor extends Actor with ActorLogging {

  def receive = {
    case Result(result: Long, replyTo: ActorRef) =>
      //this is where i would like to send the test a message with  Result(result)
      replyTo ! ActorResult(1)

    case _ =>
      log.error("Unknown message type")
  }

}

在这种情况下,sender() Manager方法中的receive是测试本身,它是ImplicitSender(正如您在测试中声明的那样)。这是一个幕后创建的演员,可以接收消息。

在非测试系统中,您可以使用ask模式或Inbox用于此目的。请参阅Actors上的文档。