繁体   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