我已经阅读了很多关于模拟的内容,特别是使用Rhino Mocks并且已经了解到Rhino Mocks只能模拟接口方法,这些方法是具体类中的虚拟或虚方法。我已经读过这个原因是因为Rhino模拟不能拦截非虚拟方法,这就是我被困住的地方。截取方法意味着什么?截取方法实际上如何模拟(特别是Rhino Mocks)
答案 0 :(得分:1)
基本上这个想法是它创建了一个“幕后”类,它覆盖了任何虚拟或接口方法,并将“模拟”代码插入其中。
如果你有(基于你的评论问题)
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的模拟版本时,它不会连接到服务器等,它只会执行您告诉它的操作,因此您可以测试依赖于“电子邮件模块”的代码实际上发送电子邮件。