我有一個外部庫用來交換消息。 在這個庫中,我有一個名爲Channel
的對象。有沒有任何理由更喜歡嘲諷一個界面而不是使用可重寫成員的類?
這是反編譯後的結果的dll:
public class Channel
{
public State CurrentState { get { /*Only for code compiling, the value depend on the TCP Connection state.*/return State.ERROR; } }
public bool Send(string message)
{
//Some stuff with TCP connection.
return true;
}
public enum State
{
DISCONNECTED,
CONNECTED,
ERROR
}
}
現在在我的代碼,我用這個Channel
一類用於發送郵件,類看起來是這樣的:
public class ClientConnection
{
private Channel MyChannel;
public ClientConnection(Channel channel)
{
MyChannel = channel;
}
public bool Send(string message)
{
bool result = false;
if(MyChannel.CurrentState == Channel.State.CONNECTED)
{
result = MyChannel.Send(message);
}
return result;
}
}
所以我目標是測試它,驗證send方法是否被調用,並檢查參數是否與我的輸入相匹配。 這裏的問題是沒有接口,方法也不是虛擬的,所以嘲笑是不可能的。
我做了什麼 我創建了重寫的屬性和方法的包裝是這樣的:
public class ChannelWrapper
{
private readonly Channel channel;
public ChannelWrapper(Channel channel)
{
this.channel = channel;
}
public virtual Channel.State CurrentState { get { return channel.CurrentState; } }
public virtual bool Send(string message)
{
return channel.Send(message);
}
}
並在構造函數和財產ClientConnection
類型Channel
改爲ChannelWrapper
。
問題 我跌倒,我應該已經創建了使用界面,而不是重寫的成員都Channel
和ChannelWrapper
,和模擬相匹配的額外接口。 同時我真的沒有看到增加一個新接口的意義。
有什麼理由更喜歡嘲笑一個接口而不是帶有可重寫成員的類嗎? (我也主要考慮表現方面)。
順便說一句,我會改變你的發送方法返回void,如果調用channel.Send失敗,拋出一個異常,如果連接不打開。返回布爾值的問題是,您的API的消費者可能會忘記檢查返回值 – Andy