什么是关于模拟的方法拦截?

时间:2010-09-14 16:41:33

标签: rhino-mocks

我已经阅读了很多关于模拟的内容,特别是使用Rhino Mocks并且已经了解到Rhino Mocks只能模拟接口方法,这些方法是具体类中的虚拟或虚方法。我已经读过这个原因是因为Rhino模拟不能拦截非虚拟方法,这就是我被困住的地方。截取方法意味着什么?截取方法实际上如何模拟(特别是Rhino Mocks)

1 个答案:

答案 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的模拟版本时,它不会连接到服务器等,它只会执行您告诉它的操作,因此您可以测试依赖于“电子邮件模块”的代码实际上发送电子邮件。