我有一个第三方组件,我正在尝试编写单元测试。问题是我无法模拟对象并且没有接口。
为了模拟,我决定创建一个接口和一个调用代码的包装类。我查看了 Visual Studio 使用元数据生成的类定义,并注意到了一些事情:
- 该类有两个构造函数(一个带参数)
- 该类继承自 IDisposable
我的问题是:
- 我下面的实现看起来正确吗?
- 我是否在代理类中正确处理了 IDisposable 实现?
- 由于接口不支持构造函数定义,我是否需要代理类中的第二个构造函数?我在我的代码中使用依赖注入,我假设除非我告诉我的 DI 框架使用第二个构造函数,否则我并不真的需要它,但我不确定。
元数据看起来像(精简版):
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();
}
}