簡體   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