【问题标题】:Akka teskit.spawn to return ActorSystemAkka teskit.spawn 返回 ActorSystem
【发布时间】:2021-01-27 14:57:54
【问题描述】:

我正在使用带有 Akka 类型的 AkkaTestFramework,但我找不到为我的一个类型的 Actor 创建 ActorSystem 模拟的方法。

我是这样找到的

val pinger: ActorRefTyped[ItAssetRequest] = testKit.spawn(ItAsset(), "itAssetMock")

但是这个ActorRefTyped 不包含schedule,我需要在我的班级内部使用ask pattern

在我收到此 ActorSystem 的班级中

class RegisterConsumerStream(itAsset: ActorSystemTyped[ItAssetRequest]){


  implicit val schedule: typed.Scheduler = itAsset.scheduler


  itAsset ? (ref => ItAssetRequest(connectorState, ref)


}

如果我通过 ActorRefTyped[ItAssetRequest] 没有时间表,所以我不能使用询问模式,因为它需要隐含的时间表。

有什么想法吗?

【问题讨论】:

    标签: java scala akka akka-typed


    【解决方案1】:

    您正在使用 testKit.spawn 方法而不是 ActorSystem 创建一个 Actor。使用 Akka TestKit,您已经在测试中拥有了可用的 ActorSystem:

    class AgentSpec extends ScalaTestWithActorTestKit { 
    
      val testKitScheduler : Scheduler = system.scheduler 
    
    }
    

    使用 testKit 中的 spawn 方法,您可以创建一个用于测试您的行为的 actor,而不是一个 actor 系统。

    class RegisterConsumerStream(as: ActorSystem[Nothing]){
    
      import akka.actor.typed.scaladsl.AskPattern._
      implicit val scheduler = as.scheduler
    
      val ref: ActorRef[ItAssetRequest] = ???
      ref.ask(ref => ItAssetRequest())
    
    }
    

    【讨论】:

    • 但是用 Akka 输入你的 Actor 实际上是一个 ActorSystem。而且我需要将演员定义为 ActorSystem 以便在另一个不是演员的类中使用他的时间表
    • 查看代码,这是 ActorSystem 实现
    • 抽象类 ActorSystem[-T]() 使用 akka.actor.typed.ActorRef[T] 扩展 scala.AnyRef 和 akka.actor.typed.Extensions 使用 akka.actor.ClassicActorSystemProvider {
    • 如你所见是一个 ActorRef[T]
    • ActorSystem 从 ActorRef 扩展而来,但这并不意味着一个演员就是一个演员系统。系统还实现了 ActorRef 类型,向系统发送消息会将消息定向到根 Actor。
    猜你喜欢
    • 2014-02-21
    • 2012-03-08
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多