2013-05-12 169 views
3

我有一個這樣的方法:單元測試使用ServerSocket類的方法的最佳方法是什麼?

public boolean isFree(LdapPort port) { 
    boolean result = false; 
    try{ 
     ServerSocket ss = new ServerSocket(port.getPortNumber()); 
     ss.getLocalPort(); 
     ss.close(); 
    } catch(IOException ex){ 
     result = true; 
    } 
    return result; 
} 

的問題是,getLocalPort()真實系統端口操作和測試期間,它通過不同的本地系統上。

應該用什麼來測試這種方法的有效方法是什麼?

回答

3

ServerSocket實例應該通過工廠,(工廠)是passed as a dependency到類可供選擇:

// Passing factory dependency via constructor injection 
public PortChecker(IServerSocketFactory socketFactory) 
{ 
    this.socketFactory = socketFactory; 
} 

// ... 
ServerSocket ss = this.socketFactory.GetServerSocket(port.getPortNumber()); 
ss.getLocalPort(); 
ss.close(); 

然後,在你的單位te ST可以mocksocketFactory返回服務器插槽,因此從任何真實世界系統「脫節」了。

注意ServerSocket也可能需要抽象(比如,通過接口/基類來表示),所以它也可以被嘲笑。

0

你需要看看嘲諷了ServerSocket類。

根據您目前的代碼調用新的測試,使硬盤。

注入的ServerSocket的實例爲您的方法/類 然後你可以注入模擬實例進行測試

我一直覺得mockito一個很好的模擬框架

1

使用PowerMock你可以嘲笑構造,details。 因此,所有的來電要嘲笑可以返回一個模擬實例,你會在你準備考試類的匹配的構造。

您的測試將要求這些註釋:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ServerSocket.class) 

然後測試方法中:

ServerSocket ssMock = createMock(ServerSocket.class); 

expectNew(ServerSocket.class, port.getPortNumber()).andReturn(ssMock); // so constructor of the ServerSocket class taking this specific port number will return the ssMock instance 

expect(ssMock.getLocalPort()).andReturn(10); // when method getLocalPort is invoked return 10 

reply(ssMock, ServerSocket.class); // do not forget to specify not only the mock instance (ssMock) but the ServerSocket class as well 
0

你可以寫

public boolean isFree(LdapPort port) { 
    try{ 
     new ServerSocket(port.getPortNumber()).close(); 
     return true; 
    } catch(IOException ex){ 
     return false; 
    } 
} 

而且你可以通過創建相同的端口和isFree上一個ServerSocket應該是假的測試,然後關閉的ServerSocket和isFree應該是真實的。

相關問題