2012-04-28 93 views
1

我試圖單元測試一個接受它們都讀寫的Socket對象的方法。我想知道,最好的方法是什麼?我在一個團隊(這是一個大學項目)工作,只負責這個(java)類,所以完全重構代碼並不是真正的選擇。最佳實踐:單元測試一個將Socket作爲參數的方法?

是否有任何類型的模擬插座可用,如「Mocket」或什麼?你會如何解決這個問題?

正如我所說,我是一名大學生,所以我期待着從論壇的智慧中學習。感謝您花時間回答。

+1

是的,模擬插座。 – 2012-04-28 19:47:38

+0

MДΓΓБДLL,我該怎麼做?你介意發佈一個鏈接? – Plastech 2012-04-28 19:49:30

回答

2

爲了讓您的代碼可測試,依賴於Socket的類應該依賴於套接字的抽象 - 例如,顯示您使用的方法(如讀寫)的簡單接口。您的應用程序將使用真實Socket類的包裝,但在單元測試中,您將能夠使用模擬(爲此,請檢查JMock)。

考慮:

public interface ISocket 
{ 
    byte[] read(); 
    int write(byte[] content); 
} 

public class SocketWrapper : ISocket 
{ 
    // read and write methods simply delegate work to real socket 
} 

public class ClassToTest 
{ 
    private ISocket socket; 

    public ClassToTest(ISocket socket) 
    { 
     this.socket = socket; 
    } 
} 

現在在你的單元測試,你可以的ISocket創建模擬,並把它傳遞給ClassToTest構造函數。通過這種方式,您可以將單元測試與其依賴關係分離。

+0

+1,但在我看來,接口應該是客戶端,而不是套接字,這將在這段代碼中提供更多的抽象。 – AlexTheo 2012-04-28 20:13:59

0

我認爲你需要首先聲明套接字接口,如:

public interface IClient{ 
bool connect(...); 
bool disconnect(...); 
bool sendData(...); 
} 

之後,創建它實現了接口的類。這個類將包含一個Socket。

在您需要測試代碼的類中,您將傳遞客戶端的接口而不是具體的實現。通過這種方式: 1)您將可以在您的測試課程中無需更改您的系統行爲。 2)你將能夠用你需要的任何實現來模擬你的客戶端,所以你將比使用socket作爲參數更容易測試代碼。

0

所有好的建議,謝謝!麻煩的是,我不得不保留我給的接口/ api,以免破壞autograder。

我做的只是繼承Socket類(我最終調用了我的子類Mocket),然後重寫getInputStream和getOutputStream方法。這使我能夠控制數據流入和流出方法,並且足以進行測試。

謝謝大家!

+0

使用該方法,您結束了在測試代碼中使用真實的'Socket'創建依賴項。創建用於測試的'Mocket'類將依賴於'Socket'類,這是你不能測試的代碼。 當你測試你的代碼時,你必須保持界限,並保證你只測試你的代碼,而不是別人的代碼。 @jimmy_keen是一個很好的答案。 – 2014-12-24 00:43:07

相關問題