3

ソケット クライアントであるクラスがあり、そのメソッドを単体テストしようとしています。テストでは、各テストの前にソケット サーバーを起動する必要があるため、以下を使用します。

@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.
            }
    }
}

ただし、2番目のテストから始まる各テストの前に、「java.net.BindException: Address already in use: JVM_Bind」が発生します。各テストで同じポートを使用しようとしていることに気付きましたが、ソケットを閉じてポートを解放するべきではありませんか?

4

2 に答える 2

4

TIME_WAITソケットを再接続しようとすると、ソケットがまだ状態になっている可能性があります。このような外部依存関係をモックすることをお勧めしますが、実際のソケットを引き続き使用したい場合は、再バインド オプションを設定してみてください。セットアップ関数では、ServerSocket myServer = new ServerSocket(port);do の代わりに:

final ServerSocket myServer = new ServerSocket();
myServer.setReuseAddress(true);
myServer.bind(new java.net.InetSocketAddress(port));
于 2013-02-06T15:39:32.167 に答える
1
  1. You already close your serversocket in "setUp" and you really should do it in a finally block.
  2. The port may not be freed immediately. You can avoid this by setting the ServerSocket's reuseAdress to true. See setReuseAddress.

And I second SimonC: maybe you are better off avoiding the socket in the first place.

于 2013-02-06T15:35:36.540 に答える