3

私は Akka を初めて使用し、Java でいくつかの単体テストを作成しようとしています。次のアクターを考えてみましょう:

public class Worker extends UntypedActor {

  @Override
  public void onReceive(Object message) throws Exception {

    if (message instanceof Work) {
      Work work = (Work) message;
      Result result = new Helper().processWork(work);
      getSender().tell(result, getSelf());
    } else {
      unhandled(message);
    }
  }

}

通話を傍受する適切な方法は何new Helper().processWork(work)ですか? 余談ですが、Java を使用して Akka アクター内で依存性注入を実現するための推奨される方法はありますか?

前もって感謝します。

4

1 に答える 1

4

あなたのコードはすでに適切にテスト可能です:

  • Helperアクターの外部をインスタンス化できるため、ビジネスロジックを個別にテストできます。
  • 想定どおりの動作を確認しHelperたら、アクターに入力を送信して、正しい応答が返されることを確認します。

ここで、他のコンポーネントをテストするために「モック」が必要な場合はWorker、ワーカーをまったく使用せず、TestProbe代わりに使用してください。通常ActorRefはワーカーを取得する場所に、注入するだけprobe.getRef()です。

それで、それを注入する方法は?

他のコンポーネントはアクターであると想定します(そうしないと、通常使用するインジェクション手法を適用するのに問題が発生しないためです)。次に、3つの基本的な選択肢があります。

  1. コンストラクター引数として渡します
  2. メッセージ内で送信する
  3. アクターが子としてrefを作成する場合はProps、おそらく代替コンストラクターで、を渡します。

3番目のケースはおそらくあなたが見ているものです(私は俳優クラスの名前に基づいて推測しています):

public class MyParent extends UntypedActor {
  final Props workerProps;

  public MyParent() {
    workerProps = new Props(...);
  }
  public MyParent(Props p) {
    workerProps = p;
  }

  ...
  getContext().actorOf(workerProps, "worker");
}

そして、あなたはTestProbeこのように注入することができます:

final TestProbe probe = new TestProbe(system);
final Props workerMock = new Props(new UntypedActorFactory() {
  public UntypedActor create() {
    return new UntypedActor() {
      @Override
      public void onReceive(Object msg) {
        probe.getRef().tell(msg, getSender());
      }
    };
  }
});
final ActorRef parent = system.actorOf(new Props(new UntypedActorFactory() {
  public UntypedActor create() {
    return new MyParent(workerMock);
  }
}), "parent");
于 2012-11-15T20:46:31.987 に答える