2013-01-24 13 views
0

我有測試功能,如果給定端口是否可用:如何強制端口不可用於測試目的?

public static boolean isPortAvailable(int port) throws IOException { 
     boolean isAvailable = false; 
     ServerSocket serverSocket = null; 
     if (isValidPort(port)) { 

      try { 
       serverSocket = new ServerSocket(port); 
       isAvailable = true; 
      } catch (IOException ignore) { 
       isAvailable = false; 
      } finally { 
       if (serverSocket != null) { 
        serverSocket.close(); 

       } 
       serverSocket = null; 
      } 

     } 
     return isAvailable; 
    } 

我需要使用JUnit測試這種方法的假條件:

@Test 
    public void testPortUnAvailable() throws IOException{ 
     int port = 49613 ; 
     Assert.assertFalse(PortUtil.isPortAvailable(port)); 
    } 

我應該如何強制端口號碼49613或任何其他端口不可用於測試? 任何其他建議更好的方式來做同樣的事情是最受歡迎的。

+1

嘗試將端口號更改爲無效端口,如-1? –

+0

它檢查有效的端口...所以它會拋出一個exception.rather比測試實際功能。 public static boolean isValidPort(int port){ \t \t boolean isValid = false; \t \t如果((端口> = MIN_PORT_NUMBER &&端口<= MAX_PORT_NUMBER)){ \t \t \t的isValid = TRUE; \t \t} \t \t return isValid; \t} – user1731553

+0

嘗試在防火牆中阻止端口 –

回答

1

創建一個ServerSocket,它綁定到一個任意的空閒端口。使用像49613這樣的硬編碼端口將會使你的測試失敗,如果這個端口目前被另一個應用程序使用,而你通常沒有太多的控制權。與動態分配的端口測試你的方法,然後關閉套接字:

ServerSocket ss = new ServerSocket(0); 
try { 
    Assert.assertFalse(PortUtil.isPortAvailable(ss.getLocalPort())); 
} 
finally { 
    ss.close(); 
} 

它也可能會更好,如果你的isPortAvailable方法檢查java.net.BindException,而不是任何IOException異常,因爲其他的IOExceptions可能意味着什麼否則是錯誤的,不一定是該端口已被使用。

+0

感謝您的建議....幫助我今天學習一些東西! – user1731553

相關問題