簡體   English   中英

使用Akka(使用Java)如何驗證我的測試中的演員正在觀看另一個演員?

[英]Using Akka (with Java) how can I verify that my actor under test is watching another actor?

我有以下actor,我想創建單元測試來驗證以下行為:

  1. ListeningActor正確注冊自己以觀看listeningTo actor。
  2. listeningTo actor終止時, ListeningActor正確殺死自己。

我該如何驗證這兩種行為?

我正在使用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);
        }
    }
}

如果它對任何人有幫助,這是我最后的單元測試:

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());
    }
}

如果您使用的是JavaTestKit和akka版本2.4.2,您可以像這樣解決它:

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

你可以在這里找到一個有用的例子 - akka-persistence-java-example

使用TestKit中的testActor觀察ListenerActor,然后在PoisonPill和/或停止它偵聽的actor時期望ListenerActor被終止。 完成。

免責聲明:我不熟悉akka。

你可以繼承ActorRef嗎? 如果是這樣,您可以專門為測試創建一個子類,以便發送消息並終止。 然后,在單元測試中,告訴您的ListeningActor實例終止,並驗證您的ListeningActor實例是否已停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM