java - JUnit 测试卡在 clientSocket.accept()?

标签 java sockets testing junit server

我需要使用 JUnit 测试一些客户端/服务器应用程序,但我在测试客户端与服务器的连接时遇到了问题。似乎测试卡在服务器类中的“Socket clientSocket = serverSocket.accept()”行,它不让我连接新客户端。

这是 JUnit 类:

 @Test
        public void testNetServerComm_1() throws Exception {
            server = new NetServerComm();
            assertNotNull(server);
        }

        @Test
        public void testAddMessageToQueue_1() throws Exception {
            NetServerComm fixture = new NetServerComm();
            NetServerSideMessage msg = new NetServerSideMessage(birdsong.comm.ServerSideMessage.Type.BIRDSONG_MESSAGE, "",
                    "");
            fixture.addMessageToQueue(msg);
            assertEquals(1, fixture.getMsgQueueSize());
        }

    @Test
        public void testClientIsConnected_1() throws Exception {
            NetServerComm fixture = new NetServerComm();
            fixture.start();

            //test doesn't go further that this..

            String nickname = "john";
            new NetClientComm().connect("127.0.0.1", nickname);
            boolean result = fixture.isClientConnected(nickname);
            assertTrue(result);
        }

客户端类:

//connects to the server
@Override
    public void connect(String host, String nickname) {
        try {
            clientNickname = nickname;
            System.out.println("Address= " + host + " and NickName = " + nickname);
            socket = new Socket(host, NetServerComm.PORTO); //8080
            System.out.println("Socket = " + socket);
            serverMsg = new NetServerSideMessage(ServerSideMessage.Type.CLIENT_CONNECTED, null, clientNickname);
            out = new ObjectOutputStream(socket.getOutputStream());
            out.writeObject(serverMsg);
            isConnected = true;
            messageHandler = new Thread(new MessageHandler(socket));
            messageHandler.start();
        } catch (IOException e) {
            System.out.println("Failed connecting to the server.");
            e.printStackTrace();
        }
    }

服务器类:

//starts the server
@Override
    public void start() {
        try {
            serverSocket = new ServerSocket(PORTO); //8080
            System.out.println("Servidor is online: " + serverSocket);
            try {
                while (true) {
                    Socket clientSocket = serverSocket.accept();

                     //test hangs at the method above^^^

                    checkNewClient(clientSocket);
                    if (nameCheck == true)
                        new Thread(new ClientHandler(clientSocket)).start();
                }
            } finally {
                System.out.println("Closing the server..");
                serverSocket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

最佳答案

看起来您的 start() 方法正由与测试相同的线程执行,因此它阻塞在那里(在 accept() 部分)。您能否尝试让这个方法由一个新的 Thread 来执行? ——伯杰

这似乎已经完成了工作:) – JDev

关于java - JUnit 测试卡在 clientSocket.accept()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104044/

相关文章:

java - 对网站的 get 请求返回错误

typescript - 是否可以更改 Playwright 中 toHaveScreenshot() 的路径?

testing - 单击下载链接并应用 .wait(120000) 会引发错误

银光性能测试

java - 用于存储具有唯一索引的数千个对象的数据结构

java - IntelliJ IDEA 像 Eclipse 一样检查变量 (Cmd-Shift-I)

Java 客户端/服务器不返回 UTF-8 字符串

java - 从Java抽象类继承后访问属性

java - 为什么 IntelliJ 给我包的名称和括号中的另一个包的名称?

python - PYZMQ REQ-REP 多客户端 ZMQError 与轮询