如何在Java中对Akka actor进行单元测试

问题描述

我在Java项目中使用了akka actor,在编写相同的单元测试时遇到了困难。我已经编写了以下示例代码来说明我的用例。

MainActor是一种控制器参与者,它接收akka消息,但不会对发送者做出任何响应。它将向初始化过程中创建了ActorRef的其他参与者发送相同或不同的消息。

package sample;

import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;

public class MainActor extends AbstractActor {

    private final ActorSystem actorSystem;
    private final ActorRef subActor1;
    private final ActorRef subActor2;

    public MainActor(ActorSystem actorSystem) {
        this.actorSystem = actorSystem;
        subActor1 = this.actorSystem.actorOf(Props.create(SubActor1.class));
        subActor2 = this.actorSystem.actorOf(Props.create(SubActor2.class));
    }

    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(InitSubActor1.class,msg -> {
                    subActor1.tell(msg,self());
                })
                .match(InitSubActor2.class,msg -> {
                    subActor2.tell(msg,self());
                })
                .build();
    }


    public static class InitSubActor1 {
    }

    public static class InitSubActor2 {
    }
}

SubActor1:

package sample;

import akka.actor.AbstractActor;

public class SubActor1 extends AbstractActor {
    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(MainActor.InitSubActor1.class,msg -> {
                    System.out.println("Received InitSubActor1");
                })
                .build();
    }
}

SubAcotor2:

package sample;

import akka.actor.AbstractActor;

public class SubActor2 extends AbstractActor {
    @Override
    public Receive createReceive() {
        return receiveBuilder()
                .match(MainActor.InitSubActor2.class,msg -> {
                    System.out.println("Received InitSubActor2");
                })
                .build();
    }
}

如上所示,当MainActor收到类型为MainActor.InitSubActor1的消息时,它将发送给SubActor1,并且当接收到类型为MainActor.InitSubActor2的消息时也会发生类似的情况。 / p>

现在,我想为MainActor编写单元测试,以便当我从单元测试发送MainActor.InitSubActor1消息时,我想断言MainActor将其发送到SubActor1 。 我尝试探索TestProbe,发现如果演员响应发件人,我们可以验证演员消息,但是我找不到一种方法来验证演员将消息发送给另一个演员而不是发送者演员的情况。

下面是我尝试过的单元测试。

package sample;

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.testkit.TestProbe;
import akka.testkit.javadsl.TestKit;
import org.junit.Test;

import static org.mockito.Mockito.spy;

public class MainActorTest {
    private ActorSystem actorSystem = spy(ActorSystem.create());

    @Test
    public void testActor() {
        new TestKit(actorSystem) {
            {
                final TestProbe probe = TestProbe.apply(actorSystem);
                final Props props = Props.create(MainActor.class,actorSystem);
                final ActorRef mainActor = actorSystem.actorOf(props);
                mainActor.tell(new MainActor.InitSubActor1(),getRef());
                probe.expectMsgClass(MainActor.InitSubActor1.class);
            }
        };
    }
}

此操作失败,因为MainActor实际上并未回复发件人。我猜这不适合我要测试的用例。 请让我知道是否有任何方法可以编写单元测试来验证发送给不同参与者的akka​​消息。

注意:我无法将ActorRefSubActor1的{​​{1}}传递给SubActor2的构造函数

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...