Java AKKA-如何对处理TCP连接的参与者进行单元测试?

Java AKKA-如何对处理TCP连接的参与者进行单元测试?,java,tcp,akka,Java,Tcp,Akka,我有一个actor将端口a绑定到预启动,然后期望得到Tcp.Bound消息。然后,它将只等待Tcp.Connected发生。此参与者不向其创建者提供任何内容,因此我希望接收Tcp消息和/或模拟Tcp管理器 到目前为止,我试图将我的TestKit探针订阅到tcp消息。除此之外,我希望创建一个可以覆盖管理器的类,但仍然不知道如何做。我正在使用Java8和JUnit5 @Override public void preStart() { this.connection = T

我有一个actor将端口a绑定到预启动,然后期望得到Tcp.Bound消息。然后,它将只等待Tcp.Connected发生。此参与者不向其创建者提供任何内容,因此我希望接收Tcp消息和/或模拟Tcp管理器

到目前为止,我试图将我的TestKit探针订阅到tcp消息。除此之外,我希望创建一个可以覆盖管理器的类,但仍然不知道如何做。我正在使用Java8和JUnit5

@Override
    public void preStart() {
         this.connection = Tcp.get(getContext().getSystem()).manager();
         this.connection.tell(TcpMessage.bind(getSelf(), remoteAddress, 100), getSelf());
    }

 @Override
    public AbstractActor.Receive createReceive() {
        return receiveBuilder()
                .match(Tcp.Bound.class, msg -> {
                    log.debug("Port Bound : [{}]", msg.localAddress());
                    this.sessionHandler = getContext().actorOf(RmiSessionHandler.props(getSelf(), settings));
                    this.buffer = getContext().actorOf(RmiBuffer.props(this.sessionHandler, settings));
                    this.connection = getSender();

                }).match(Tcp.Connected.class, msg -> {
                    log.debug("Port Connected to : [{}])", msg.remoteAddress());
                    this.sessionHandler.tell(msg, getSelf());
                    sender().tell(TcpMessage.register(getSelf()), getSelf()); // Register ourselves
                    this.session = getSender();
                    this.isConnectedToClient = true;
你可以看到我的演员只是创造了其他演员,但我不想通过他们来测试他是否建立了联系

我很想知道我的参与者何时发送Tcp.Bind,或者何时绑定端口以及在哪个端口上

以下是我尝试过的:

system = ActorSystem.create("sessionHandlerTest");
testProbe = new TestKit(system);
system.eventStream().subscribe(testProbe.getRef(), Tcp.Bound.class);
rmiSocket = system.actorOf(RmiSocket.props(testProbe.getRef(), settings));
Tcp.Bound bindingMessage = testProbe.expectMsgClass(Tcp.Bound.class);
我还尝试将我的探测器注册到tcp管理器:

ActorRef tcpManager = Tcp.get(system).manager();
tcpManager.tell(TcpMessage.register(testProbe.getRef()), testProbe.getRef());

简而言之,假设您有一个需要连接到数据库的类a。不是让A实际连接,而是为A提供了可用于连接的接口。为了进行测试,您用一些东西实现了这个接口——当然不需要连接。如果类B实例化了A,它必须向A传递一个“真实的”数据库连接。但这意味着B打开一个数据库连接。这意味着要测试B,您将连接注入B。但是B在类C中实例化,以此类推

那么在哪一点上我必须说“这里我从数据库中获取数据,我不会为这段代码编写单元测试”

换句话说:在某个类的代码中,我必须调用sqlDB.connect()或类似的东西。如何测试这个类


处理GUI或文件系统的代码也一样吗?

因此,简而言之,假设您有一个需要连接到数据库的类a。不是让A实际连接,而是为A提供了可用于连接的接口。为了进行测试,您用一些东西实现了这个接口——当然不需要连接。如果类B实例化了A,它必须向A传递一个“真实的”数据库连接。但这意味着B打开一个数据库连接。这意味着要测试B,您将连接注入B。但是B在类C中实例化,以此类推

那么在哪一点上我必须说“这里我从数据库中获取数据,我不会为这段代码编写单元测试”

换句话说:在某个类的代码中,我必须调用sqlDB.connect()或类似的东西。如何测试这个类


处理GUI或文件系统的代码也一样吗?

如果我理解你的观点,你是说因为我不与actor的创建者交互,所以不应该测试它正在进行的tcp连接?我理解gui并不真正需要或者非常难以进行单元测试,但是在这种情况下,tcp连接的步骤对于我的软件来说非常重要。我需要验证,在任何情况下,我们都不会根据状态改变顺序。另外,我不想通过后续参与者进行测试,因为他们还有其他关键角色和多个状态,这些状态不会真正代表tcp连接。此外,这个参与者是唯一处理tcp连接的参与者。没有其他职业或演员会处理这种联系。此参与者正在获取tcp管理器,启动绑定并自行管理连接。如果我理解您的观点,您是说因为我不与参与者的创建者交互,所以不应该测试它正在进行的tcp连接?我理解gui并不真正需要或者非常难以进行单元测试,但是在这种情况下,tcp连接的步骤对于我的软件来说非常重要。我需要验证,在任何情况下,我们都不会根据状态改变顺序。另外,我不想通过后续参与者进行测试,因为他们还有其他关键角色和多个状态,这些状态不会真正代表tcp连接。此外,这个参与者是唯一处理tcp连接的参与者。没有其他职业或演员会处理这种联系。该参与者将获得tcp管理器,启动绑定并自行管理连接。