使用Akka(与Java一起使用)如何验证我的被测参与者正在观看另一个参与者?

使用Akka(与Java一起使用)如何验证我的被测参与者正在观看另一个参与者?,java,unit-testing,akka,Java,Unit Testing,Akka,我想为以下参与者创建单元测试,以验证以下行为: ListeningActor正确注册自身以观看listeningToactor ListeningActor当listeningToactor终止时,正确地自杀 如何验证这两种行为 我将Akka 2.0.2与Java一起使用 谢谢 公共类ListingActor扩展了UntypedActor{ 私人最终执行人,如收听者; 公众参与人(最终参与人){ this.listengto=listengto; } @凌驾 公共无效预启动(){ super.p

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

  • ListeningActor
    正确注册自身以观看
    listeningTo
    actor
  • ListeningActor
    listeningTo
    actor终止时,正确地自杀
  • 如何验证这两种行为

    我将Akka 2.0.2与Java一起使用

    谢谢

    公共类ListingActor扩展了UntypedActor{
    私人最终执行人,如收听者;
    公众参与人(最终参与人){
    this.listengto=listengto;
    }
    @凌驾
    公共无效预启动(){
    super.preStart();
    
    context().watch(listeningTo);//免责声明:我对akka不熟悉


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

    从TestKit中使用testActor查看ListengGenerator,然后,当您毒杀或阻止它所收听的演员时,ListGenerator将被终止。完成。

    如果它对任何人都有帮助,下面是我的最后一个单元测试:

    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());
        }
    }
    
    公共类ListingActorTest
    {
    私人测试套件;
    私人遗嘱执行人;
    私有TestProbe ListingToActor;
    @以前
    public void setUp()引发异常
    {
    testKit=新的testKit(ActorSystem.apply());
    listingToActor=TestProbe.apply(testKit.system());
    listeningActor=TestActorRef.apply(新的Props(新的非类型dactorfactory)()
    {
    @凌驾
    公共参与者创建()
    {
    返回新的ListingActor(ListingToActor.ref());
    }
    }),testKit.system());
    }
    @试验
    当ListeningToActor终止()时,公共无效应终止
    {
    //给定
    assertFalse(listingActor.isTerminated());
    //什么时候
    ListingToActor.testActor().tell(toxingPill.getInstance());
    //然后
    assertTrue(ListingActor.isTerminated());
    }
    }
    
    如果您使用的是JavaTestKit和akka 2.4.2版,您可以这样解决:

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

    您可以在这里找到一个工作示例-

    谢谢Eric。我实际上希望使用包含Akka测试工具包的解决方案。我希望确保
    context().watch()
    context().stop())
    方法被正确调用。谢谢,这比我想象的要简单。它捕获了一个错误-if条件应该被写成
    if(terminated.actor().equals(listingto))