【发布时间】:2010-09-14 16:41:33
【问题描述】:
我阅读了很多关于模拟的文章,尤其是使用 Rhino Mocks 并了解到 Rhino Mocks 只能模拟接口方法,这些接口方法是虚拟的或具体类中的虚拟方法。我已经读过这是因为 Rhino 模拟无法拦截非虚拟方法,这就是我卡住的地方。拦截方法是什么意思?拦截方法在模拟(尤其是 Rhino Mocks)方面实际上是如何工作的
【问题讨论】:
标签: rhino-mocks
我阅读了很多关于模拟的文章,尤其是使用 Rhino Mocks 并了解到 Rhino Mocks 只能模拟接口方法,这些接口方法是虚拟的或具体类中的虚拟方法。我已经读过这是因为 Rhino 模拟无法拦截非虚拟方法,这就是我卡住的地方。拦截方法是什么意思?拦截方法在模拟(尤其是 Rhino Mocks)方面实际上是如何工作的
【问题讨论】:
标签: rhino-mocks
基本上,这个想法是创建一个“幕后”类,覆盖任何虚拟或接口方法,并将“模拟”代码插入其中。
如果你有(基于你的评论问题)
public EmailHelper
{
public virtual int SendEmail( MailMessage message)
{
var server = ConnectToServer();
int statusCode = server.SubmitEmail( message );
return statusCode;
}
}
然后在测试中(我忘记了 Rhino 的语法,但这已经足够接近了)
var mock = Mocks.CreateMockFor<EmailHelper>();
Expect.Call(mock.SendEmail).Return(5);
在幕后它将使用反射加载 SomeClass Type 对象,搜索接口实现和虚拟方法并生成类似的类
public MockEmailHelper
{
public override int SendEmail( MailMessage message )
{
return 5;
}
}
如您所见,当您调用 SendEmail 的模拟版本时,它不会连接到服务器等,它只会按照您的指示执行操作,因此您可以测试依赖于“电子邮件模块”的代码,而无需实际发送电子邮件。
【讨论】: