単体テストを作成しようとしているサードパーティのコンポーネントがあります。問題は、オブジェクトをモックできず、インターフェイスがないことです。
モックのために、コードを呼び出すインターフェイスとラッパー クラスを作成することにしました。メタ データを使用して Visual Studio によって生成されたクラス定義を調べたところ、いくつかのことに気付きました。
- クラスには 2 つのコンストラクターがあります (1 つはパラメーターを受け取ります)。
- クラスは IDisposable から継承します
私の質問は次のとおりです。
- 以下の私の実装は正しく見えますか?
- プロキシ クラスで IDisposable の実装を正しく処理しましたか?
- インターフェイスがコンストラクター定義をサポートしていないため、プロキシ クラスに 2 番目のコンストラクターが必要ですか? コードで依存性注入を使用していますが、DI フレームワークに 2 番目のコンストラクターを使用するように指示しない限り、実際には必要ないと思いますが、よくわかりません。
メタデータは次のようになります (縮小版):
public class PopClient : IDisposable
{
public const int DefaultPort = 110;
public const int DefaultSSLPort = 995;
public PopClient();
public PopClient(AddressFamily addressFamily);
public bool HasTimeStamp { get; }
public List<string> Capability();
public void Connect(string host);
protected override void GetServerGreeting();
}
メタデータに基づいて、私のインターフェイスは次のようになります (インターフェイス定義で無効なメソッド/プロパティ/アクセス修飾子を削除した後):
public interface IPopClient : IDisposable
{
bool HasTimeStamp { get; }
List<string> Capability();
void Connect(string host);
void ConnectSSL(string host);
}
インターフェイスに基づいて、ラッパー クラスを作成しました。
public class PopClientProxy : IPopClient
{
private readonly Pop3 pop3;
public PopClientProxy()
this.pop3 = new Pop3();
public PopClientProxy(AddressFamily addressFamily)
this.pop3 = new Pop3(addressFamily);
public bool HasTimeStamp
get { return pop3.HasTimeStamp; }
public List<string> Capability()
return pop3.Capability();
public void Connect(string host)
pop3.Connect(host);
public void Dispose()
{
if (pop3 != null)
pop3.Dispose();
}
}