2012-06-18 87 views
4

我有以下的男演員,我想創建單元測試,以驗證以下行爲:使用Akka(與Java)如何驗證被測試的演員是否正在觀看另一個演員?

  1. ListeningActor正確註冊本身看listeningTo演員。
  2. ListeningActorlisteningTo角色終止時正確殺死自己。

如何驗證這兩種行爲?

我正在使用Akka 2.0.2和Java。

感謝

public class ListeningActor extends UntypedActor { 
    private final ActorRef listeningTo; 

    public ListeningActor(final ActorRef listeningTo) { 
     this.listeningTo = listeningTo; 
    } 

    @Override 
    public void preStart() { 
     super.preStart(); 
     context().watch(listeningTo);   // <---- To verify 
    } 

    @Override 
    public void onReceive(final Object o) throws Exception { 
     if (o instanceof Terminated) { 
      Terminated terminated = (Terminated) o; 
      if (terminated.equals(listeningTo)) { 
       context().stop(self());  // <---- To verify 
      } 
     } else { 
      unhandled(o); 
     } 
    } 
} 

回答

2

使用TestKit中的testActor監聽ListenerActor,然後期望當您PoisonPill時ListenerActor被終止並且 - 或者停止它監聽的actor。完成。

+0

謝謝,那比我想象的要容易。它發現了一個bug - if條件應該寫成if(terminated.actor()。equals(listeningTo))' – vegemite4me

0

免責聲明:我不熟悉阿卡。

你可以繼承ActorRef嗎?如果是這樣,你可以製作一個專門用於測試的子類,你可以讓它發送消息並終止。然後,在你的單元測試中,告訴你的ListeningActor實例被終止,並驗證你的ListeningActor實例已經停止。

+0

謝謝埃裏克。我實際上希望使用包含Akka的TestKit的解決方案。我想確保正確調用'context()。watch()'和'context()。stop()'方法。 – vegemite4me

5

如果有幫助的人,這是我最後的單元測試:

public class ListeningActorTest 
{ 
    private TestKit testKit; 
    private TestActorRef<ListeningActor> listeningActor; 
    private TestProbe listeningToActor; 

    @Before 
    public void setUp() throws Exception 
    { 
     testKit = new TestKit(ActorSystem.apply()); 
     listeningToActor = TestProbe.apply(testKit.system()); 
     listeningActor = TestActorRef.apply(new Props(new UntypedActorFactory() 
     { 
      @Override 
      public Actor create() 
      { 
       return new ListeningActor(listeningToActor.ref()); 
      } 
     }), testKit.system()); 
    } 

    @Test 
    public void shouldTerminateWhenTheListeningToActorTerminates() 
    { 
     //Given 
     assertFalse(listeningActor.isTerminated()); 

     //When 
     listeningToActor.testActor().tell(PoisonPill.getInstance()); 

     //Then 
     assertTrue(listeningActor.isTerminated()); 
    } 
} 
3

如果您正在使用JavaTestKit和阿卡版本2.4.2,你可以解決這個問題是這樣的:

@Test 
public void testThatPersistenceActorShutdown() { 
    watch(persistenceActor); 
    persistenceActor.tell(new Shutdown(), getRef()); 
    expectTerminated(persistenceActor); 
} 

你可以找到這裏的工作示例 - akka-persistence-java-example