繁体   English   中英

AKKA-如何对处理TCP连接的actor进行单元测试?

[英]AKKA - How can I unit test my actor that handle a TCP connection?

我有一个将端口绑定到preStart的actor,然后期望收到Tcp.Bound消息。 然后,它将仅等待Tcp.Connected发生。 这个演员没有为其创建者提供任何东西,因此我想接收Tcp消息和/或模拟Tcp Manager

到目前为止,我尝试将我的TestKit探针订阅到tcp消息。 除此之外,我还想创建一个将覆盖管理器的类,但是仍然不知道该怎么做。 我正在使用Java 8和JUnit 5。

@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提供了A可以用来连接的接口。 为了进行测试,您需要使用一些东西来实现此接口-当然不需要连接。 如果类B实例化了A,则必须将“真实”数据库连接传递给A。但这意味着B将打开数据库连接。 这意味着要测试B,您需要将连接注入B。但是B是在类C中实例化的,依此类推。

因此,在什么时候我必须说“在这里,我从数据库中获取数据,而我不会为这段代码编写单元测试”?

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

并且与必须处理GUI或文件系统的代码是否相同?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM