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

时间:2019-07-17 14:28:02

标签: java tcp akka

我有一个actor,它将一个port绑定到preStart,然后期望Tcp.Bound消息。然后,它将仅等待Tcp.Connected发生。该演员没有为其创建者提供任何内容,因此我想接收Tcp消息和/或模拟Tcp管理器

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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