私たちはプロジェクトを型指定された akka アクターに移行しています。次のような、アクターを自由に作成できるサービスがあります。
class Service(ac: ActorContext[_])
def action() = {
ac.spawn(MyBehavior().receive)
}
}
このサービスをテストしようとしているときに問題が発生します。 testKit.spawn メソッドまたは testKit.createTestProbe メソッドのみを使用する必要があるようです。クラスの単体テストには問題なく機能します。
しかし、ActorContext[_] を取得してテスト中のサービスに渡す方法はありません。
つまり、サービスで ActorContext を誤って使用しているようです。しかし、サービスはどのようにして新しいアクターを作成できるのでしょうか?
これらのアクターを作成できる特別な ActorRef[CreateActor] を渡すというアイデアがあります。この方法で、サービス内の ActorContext[_] への依存関係を削除できますが、より良いオプションがあるかどうかを確認したいと思いました。
------------------------
まず、コンテキスト内で公開されるメソッドの多くはスレッドセーフではないため、ActorContext を渡さないでください。
JVM ごとに単一の ActorSystem[SpawnProtocol.Command] を作成し、それをサービスに渡すことができます。
その後、型指定されたアクターの動作を注入されたactorSystem に受け取る Spawn コマンドを送信できます。
val echoActor: Future[ActorRef[Echo]] = actorSustem ? { replyTo: ActorRef[ActorRef[Echo]] => Spawn(echoBehavior, "echo-actor", Props.empty, replyTo)}
しかし、本当にサービスからアクターを作成する必要があるのでしょうか?
おそらく、必要なアクターをすべて作成し、ActorRef をサービスに注入するトップレベルの配線を行うことができます。
もちろん、アクターの寿命が短く、需要に基づいて作成されたり破棄されたりする場合は、私は何をしますか上記で提案したことは理にかなっています。
4
テストするには、新しい ActorSystem を作成する必要があるということでしょうか? TestKit の ActorSystem で動作しますか? class Service(ac: ActorSystem[SpawnProtocol.Command]) {...} 私の知る限り、TestKit は次の方法を提供していません。
– KaC
2020 年 9 月 4 日 7:41
... ActorSystem を作成します[_]
– KaC
2020 年 9 月 4 日 7:51
どのテストキットについて話しているのですか? BehaviorTestkit または ScalatestWithActorTestKit?
– プリタム・カダム
2020 年 9 月 4 日 8:16
akka.actor.testkit.typed.scaladsl.ActorTestKit、specs2 で使用しています
– KaC
2020 年 9 月 4 日 8:26