scala - 統合テストでの akka ActorContext の使用法

okwaves2024-01-25  9

私たちはプロジェクトを型指定された 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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。