あなたのコードはすでに適切にテスト可能です:
Helper
アクターの外部をインスタンス化できるため、ビジネスロジックを個別にテストできます。
- 想定どおりの動作を確認し
Helper
たら、アクターに入力を送信して、正しい応答が返されることを確認します。
ここで、他のコンポーネントをテストするために「モック」が必要な場合はWorker
、ワーカーをまったく使用せず、TestProbe
代わりに使用してください。通常ActorRef
はワーカーを取得する場所に、注入するだけprobe.getRef()
です。
それで、それを注入する方法は?
他のコンポーネントはアクターであると想定します(そうしないと、通常使用するインジェクション手法を適用するのに問題が発生しないためです)。次に、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");