首页 文章

如何在Akka中用TestActorRef包装现有的ActorRef?

提问于
浏览
0

在测试akka actors系统时,我用多个嵌套的actor实例化它 . 作为入口点,父actor生成嵌套的子actor的树 . 与 生产环境 树类似,但包含来自H2 db源的测试数据 .

我需要验证整个系统的一部分(假设单个actor状态),由于数据不一致,无法从其他系统中单独访问或实例化 .

我知道,对于独立的演员测试,可以通过使用下面的构造来获得它的内部状态:

TestActorRef<RoutingRequestHandlerActor> fsmRef = TestActorRef.create(getSystem(), RoutingRequestHandler.props(), getTestActor());
RoutingRequestHandlerActor fsm = fsmRef.underlyingActor();

但如果间接创造演员,我该怎么办?是否有可能以某种方式包装它来获得 Actor 而不是 ActorRef

作为替代解决方案,我知道可以使用状态描述发送其他诊断消息 . 但也许还有另一种更聪明的方式呢?

1 回答

  • 0

    是否有可能以某种方式包装它来获得Actor而不是ActorRef?

    在一般情况下,不可能在远程服务器上创建可能的Actor实例 .

    作为替代解决方案,我知道可以使用状态描述发送其他诊断消息 .

    这就是我建议你做的 . 只需发送一条特殊消息,将RetrieveState()称为actor,并向actor添加一些代码以响应其特定于应用程序的状态 .

    这就是Akka在内部用于类似目的的方式 . 看一下Identify消息:

    https://doc.akka.io/japi/akka/current/akka/actor/Identify.html

    case class RetrieveStateRequest()
    case class RetrieveStateResponse[T](actorState: T)
    
    ...
    
    class YourActor extends Actor {
    
      def receive: Receive = {
        case RetrieveStateRequest() => 
             sender() ! RetrieveStateResponse(actorState)
        case m => unhandled(m)
      }
    }
    

相关问题