4

我有以下参与者,我想为其创建单元测试以验证以下行为:

  1. ListeningActor正确注册自己以观看listeningTo演员。
  2. ListeningActorlisteningTo当actor终止时正确地杀死自己。

如何验证这两种行为?

我正在使用带有 Java 的 Akka 2.0.2。

谢谢

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

4 回答 4

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());
    }
}
于 2012-06-19T08:33:35.993 回答
3

如果您使用 JavaTestKit 和 akka 2.4.2 版,您可以这样解决:

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

你可以在这里找到一个工作示例 - akka-persistence-java-example

于 2016-03-07T20:41:35.003 回答
2

使用 TestKit 中的 testActor 观察 ListenerActor,然后期望在 PoisonPill 和/或停止它所侦听的演员时终止 ListenerActor。完毕。

于 2012-06-18T15:59:38.650 回答
0

免责声明:我不熟悉akka。

你可以继承 ActorRef 吗?如果是这样,您可以创建一个专门用于测试的子类,您可能会导致发送消息并被终止。然后,在您的单元测试中,告诉您的 ListeningActor 实例被终止,并验证您的 ListeningActor 实例是否已停止。

于 2012-06-18T13:53:09.660 回答