使用Akka(使用Java)如何验证我的测试中的演员正在观看另一个演员?

时间:2012-06-18 12:35:20

标签: java unit-testing akka

我有以下actor,我想创建单元测试来验证以下行为:

  1. ListeningActor正确注册自己以观看listeningTo演员。
  2. ListeningActorlisteningTo actor终止时正确杀死。
  3. 如何验证这两种行为?

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

4 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分:3)

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

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

您可以在此处找到一个有效的示例 - akka-persistence-java-example

答案 2 :(得分:2)

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

答案 3 :(得分:0)

免责声明:我对akka不熟悉。

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

相关问题