【问题标题】:What is method interception with regards to mocking?什么是关于模拟的方法拦截?
【发布时间】:2010-09-14 16:41:33
【问题描述】:

我阅读了很多关于模拟的文章,尤其是使用 Rhino Mocks 并了解到 Rhino Mocks 只能模拟接口方法,这些接口方法是虚拟的或具体类中的虚拟方法。我已经读过这是因为 Rhino 模拟无法拦截非虚拟方法,这就是我卡住的地方。拦截方法是什么意思?拦截方法在模拟(尤其是 Rhino Mocks)方面实际上是如何工作的

【问题讨论】:

    标签: rhino-mocks


    【解决方案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 的模拟版本时,它不会连接到服务器等,它只会按照您的指示执行操作,因此您可以测试依赖于“电子邮件模块”的代码,而无需实际发送电子邮件。

    【讨论】:

    • 所以模拟框架实际上调用了你的方法的实现。它真的执行它们吗?例如,如果我模拟一个电子邮件方法,它会发送电子邮件吗?
    • 不,这就是重点……这样您就不必依赖外部系统了。我会添加更多来帮助澄清,等等....
    • 哇,感谢您的解释。现在更有意义了。不依赖于外部系统,你的意思是我将系统的不同部分作为一个整体隔离,对吗?根据您上面的示例,模拟更多的是测试代码的交互,而不是实际的实现?
    • 正确,隔离是目标。在这种情况下,您将测试不是电子邮件,它依赖于 EmailHelper。所以你想在不实际运行 EmailHelper 代码的情况下测试依赖对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多