2016-12-09 3 views
0

javaのAkka Actorをテストしようとしています。テストがしようとしているものです。コードはAkkaのアクタが生きていて、イベントストリームに登録されていることを確認する方法

です。
  • このテスト対象のアクターは、コンストラクタ内の偶数ストリームにサブスクライブします。
  • アクターは、アクターシステム上のnormal actorOfを使用してテストで作成されます。
  • これはActorRefを返しますが、実際のアクターはシーンの背後に非同期で作成されています。
  • テストでイベントストリームにメッセージを公開します。
  • しかし、アクターは非同期に構築されるため、メッセージはアクターがイベントストリームにサブスクライブする前にイベントストリームにパブリッシュされます。
  • 結果:テスト対象のアクタはメッセージを見ることはありません。また、nerverはメッセージを転送するアクタに転送します。テストに失敗するのは、転送先の俳優がこのテストでメッセージが届くことを期待するテストプローブであるためです。

メッセージをイベントストリームにパブリッシュする前に眠ったり、少し待ったりできますが、アクターが完全に起動していることを確認するための「クリーンな」方法はありませんか?俳優が自分自身の作成を完了したことを示すイベントストリームのイベントを聞くことはできますか?

@Test 
public void testListenOnEventStreamAndForward() throws InterruptedException 
{ 
    // given 
    final TestProbe actorToForwardMessageTo = new TestProbe(this.actorSystem); 
    final Function<ActorRefFactory, ActorRef> actorToForwardMessageTosFactoryFunction = (actorRefFactory) -> actorToForwardMessageTo.ref(); 
    this.actorSystem.actorOf(Props.create(ActorUnderTest.class,() -> new ActorUnderTest(actorToForwardMessageTosFactoryFunction))); 

    //The test is green, depending on the whether we sleep here or not 
    //Thread.sleep(1000); 

    // when 
    this.eventStream.publish("someStringMessageTheActorUnderTestShouldPickUp"); 

    // then 
    actorToForwardMessageTo.expectMsg("someStringMessageTheActorUnderTestShouldPickUp"); 
} 


private static class ActorUnderTest extends AbstractActor 
{ 

    public ActorUnderTest(final Function<ActorRefFactory, ActorRef> actorToForwardMessageToFactoryFunction) throws Exception 
    { 
     context().system().eventStream().subscribe(self(), String.class); 
     final ActorRef actorToForwardMessageTo = actorToForwardMessageToFactoryFunction.apply(getContext()); 

     receive(ReceiveBuilder 
       .match(
         String.class, 
         stringMessage -> actorToForwardMessageTo.tell(stringMessage, self())) 
       .matchAny(
         message -> unhandled(message)) 
       .build()); 
    } 

} 
+0

あなたのテストで 'resolveOne'関数を使うとどうなりますか? – rethab

+0

私が間違っていないと、resolveOneはactorPathで動作します。私はactorRefしか利用できません。 –

答えて

関連する問題