繁体   English   中英

单元测试java中的套接字

[英]unit testing sockets in java

我有一个类是一个套接字客户端,我试图对其方法进行单元测试。 测试要求我在每次测试之前启动套接字服务器,所以我使用:

@Before
public void setUp() {
    if (myServerSocket == null) {
    Thread myThread = new Thread() {
        public void run() {
            DataInputStream dis = null;
            DataOutputStream dos = null;
            try {
                ServerSocket myServer = new ServerSocket(port);
                myServerSocket = myServer.accept();
                dis = new DataInputStream(myServerSocket.getInputStream());
                dos = new DataOutputStream(myServerSocket.getOutputStream());
                byte[] bytes = new byte[10];
                dis.read(bytes);
                boolean breakLoop = false;
                do {
                    if (new String(bytes).length() != 0) {
                        dos.writeBytes(serverMessage + "\n");
                        dos.flush();
                        breakLoop = true;
                        dos.writeBytes("</BroadsoftDocument>" + "\n");
                        dos.flush();
                    }
                } while (!breakLoop);
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    myThread.start();
    }
} 

在每次测试后,我尝试关闭服务器套接字,以便我可以重新打开服务器套接字以进行下一个测试:

@After
public void tearDown() throws IOException, BroadsoftSocketException {
    System.out.println("@After");
    if (myServerSocket != null) {
        myServerSocket.close();
        myServerSocket = null;
            try {
                Thread.sleep(5000);
            } 
            catch (InterruptedException e) {
                // do nothing.
            }
    }
}

但是,在第二次测试开始的每次测试之前,我得到“java.net.BindException:Address in in use:JVM_Bind”。 我意识到我试图为每个测试使用相同的端口,但是不应该关闭套接字释放端口?

当您尝试重新连接时,您的套接字可能仍处于TIME_WAIT状态。 我建议模拟这样的外部依赖项,但如果你确实发现自己想要继续使用真正的套接字,那么尝试设置重新绑定选项。 在您的安装功能中,而不是ServerSocket myServer = new ServerSocket(port); 做:

final ServerSocket myServer = new ServerSocket();
myServer.setReuseAddress(true);
myServer.bind(new java.net.InetSocketAddress(port));
  1. 您已经在“setUp”中关闭了您的serversocket,您真的应该在finally块中执行它。
  2. 端口可能不会立即释放。 您可以通过将ServerSocket的reuseAdress设置为true来避免这种true 请参见setReuseAddress

而我第二个SimonC:也许你最好先避开套接字。

暂无
暂无

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

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