加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何测试Akka演员是在Scala创建的

发布时间:2020-12-16 21:30:52 所属栏目:安全 来源:网络整理
导读:我试图写一个测试,将验证我的下面的演员是创建一个heartBeatExpireWorker和一个heartBeatAcceptpter,但我不知道如何做到这一点. 首先我想我可以使用Mockhito模拟或间谍代替上下文,然后验证我调用了actorOf,但是我无法弄清楚注入上下文的方法,而不会破坏Akka
我试图写一个测试,将验证我的下面的演员是创建一个heartBeatExpireWorker和一个heartBeatAcceptpter,但我不知道如何做到这一点.

首先我想我可以使用Mockhito模拟或间谍代替上下文,然后验证我调用了actorOf,但是我无法弄清楚注入上下文的方法,而不会破坏Akka测试框架.

然后,我想我可以向工作人员发送一个Identify消息来验证它们是否存在.但是在我看来,这样做是不行的,因为Akka TestKit似乎并没有产生被测试的演员的小孩演员.它只能接受可以支持邻近演员的Testprobe.

class HeartBeatPumpWorker(chatService: ChatService,target: HeartBeatMessageCmd) extends Actor with ActorLogging with
WorkersReference {

  val heartBeatInterval = chatService.getHeartBeatInterval

  val tick = context.system.scheduler.schedule(0 millis,heartBeatInterval millis,self,SendHeartBeat(target))

  override def postStop() = tick.cancel()

  def receive = {
    case SendHeartBeat(command: HeartBeatMessageCmd) =>
      log.debug("Sending heartbeat")
      //Send heartbeat to GWT
      val userTarget = NetworkWorker.buildEventUserTarget(command.getEventCode,command.getUser)

      val uuid: String = UUID.randomUUID().toString
      val freshCommand = new HeartBeatMessageCmd(command.getUser,command.getEventCode,uuid,command.getUserSession)
      networkWorker ! NetworkBroadcast(userTarget,freshCommand)

      val heartBeatId: String = freshCommand.getUuid
      //create expirer
      val heartBeatExpireWorkerRef = context.actorOf(HeartBeatExpireWorker.props(chatService,freshCommand),HeartBeatExpireWorker.name(heartBeatId))
      val heartBeatAccepterRef = context
        .actorOf(HeartBeatAcceptWorker.props(chatService,HeartBeatAcceptWorker.name(heartBeatId))

      //record heartbeat
        chatService.saveSentHeartbeat(heartBeatId,freshCommand.getUserSession,freshCommand.getEventCode,freshCommand.getUser,freshCommand.getTimeCmdGenerated)
    case _ =>
      log.error("Pumper received unknown message.  This shouldn't happen " + sender.path.toString)
      self ! PoisonPill
  }

}


object HeartBeatPumpWorker {
  def name(eventCode: String,user: String,sessionId: String) = f"HeartBeatPumpWorker-$eventCode-$user-$sessionId"

  def path(eventCode: String,sessionId: String) : String = {
    EventWorker.Path + "/" + name(eventCode,user,sessionId)
  }

  def props(chatService: ChatService,heartBeatMsgCmd: HeartBeatMessageCmd) = {
    Props(classOf[HeartBeatPumpWorker],chatService,heartBeatMsgCmd)
  }
}

解决方法

在父HeartBeatPumpWorker的构造函数中为孩子注入Props(例如HeartBeatAcceptWorker.props).从测试中通过你想要的任何道具.让父母通过提供的道具实例化孩子.与孩子交往.最后一部分取决于你的数据流.例如,如果父母屏蔽孩子,但是将消息委托给他们,则将消息发送给父母.如果孩子彼此交谈使用测试探针或类似的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读