JavaTestKit を使用して Akka JUnit テストを作成していますが、何が間違っているのかを理解しようとしています。
Inbox オブジェクトを作成し、ExecutiveSupervisor にメッセージを送信するために使用する AkkaSystem があります。
ActorSystem akkaSystem = ActorSystem.create("myAkkaSystem");
Props executiveProps = Props.create(ExecutiveSupervisor.class);
TestActorRef<ExecutiveSupervisor> executiveSupervisorTestActorRef = TestActorRef.create(akkaSystem, executiveProps, "testExecutiveSupervisor");
new JavaTestKit(akkaSystem) {{
final Inbox inbox = Inbox.create(akkaSystem);
inbox.send(executiveSupervisorTestActorRef, new Object());
ResultAndData result = (Object)inbox.receive(Duration.create(2, TimeUnit.SECONDS));
}};
ResultAndData オブジェクトは、UnTypedActor である ExecutiveSupervisor クラスに渡され、デバッグ中にこれを見ると正しく受信されます。
実行は、アクター内のコードを非常にうまく処理します。ワーカーのある時点で、渡されたのと同じオブジェクト (ResultAndData) を、ActorSystem レベルでのテストで JUnit の受信ボックスに返すことを期待しています。つまり、ワーカーが渡されたのと同じオブジェクトを親に返すようにしたいのです。
しかし、次の行で返そうとするのと同じように:
log.info("SUCCESS!!!!!!!!!!!");
getContext().parent().tell(result, getSelf()); //FAILS HERE
その時点で、次のメッセージが表示されます。
[INFO] [09/30/2013 19:22:38.609] [default-akka.actor.default-dispatcher-4] [akka://default/user] メッセージ [com.netaporter.modules.serviceagent.remoteservices.ResultAndData ] TestActor[akka://default/user/testExecutiveSupervisor] から Actor[akka://default/user] へ配信されませんでした。[1] デッドレターが発生しました。このロギングは、構成設定 'akka.log-dead-letters' および 'akka.log-dead-letters-during-shutdown' でオフにするか、調整することができます。
基本的に、メッセージは私が何をしたいのかを正確に説明していますが、そうではありません。testExecutiveSupervisor からその親であるデフォルト/ユーザーに返される ResultAndData オブジェクトが必要です。
JUnit に次の行を追加すると、次のようになります。
expectMsgEquals(duration("2 seconds"), result);
「結果」が私の ResultAndData オブジェクトであるため、メッセージが通過しないため、常にタイムアウトします。
ありがとう、どんな助けでも素晴らしいでしょう。