如何在没有界面的情况下模拟一个类?

 平凡屋之换 发布于 2023-02-12 17:21

我正在使用Windows 7中的C#开发.NET 4.0.

我想测试一些使用mock的方法之间的通信.唯一的问题是我想在没有实现接口的情况下这样做.那可能吗?我刚刚阅读了很多关于模拟对象的主题和一些教程,但是它们都用于模拟接口,而不是类.我尝试使用Rhino和Moq框架.

6 个回答
  • 标准的模拟框架正在创建代理类.这就是他们在技术上限于接口和虚拟方法的原因.

    如果您还想模拟"普通"方法,则需要一个可以使用检测而不是代理生成的工具.例如MS Moles和Typemock可以做到这一点.但前者有一个可怕的'API',而后者是商业的.

    2023-02-12 17:23 回答
  • 大多数模拟框架(包括Moq和RhinoMocks)生成代理类作为模拟类的替代,并使用您定义的行为覆盖虚拟方法.因此,您只能在具体或抽象类上模拟接口或虚拟方法.另外,如果你在嘲笑一个具体的类,你几乎总是需要提供一个无参数的构造函数,以便模拟框架知道如何实例化该类.

    为什么厌恶在代码中创建接口?

    2023-02-12 17:23 回答
  • 如果您不能更改被测类,那么我建议的唯一选择是使用MS Fakes https://msdn.microsoft.com/en-us/library/hh549175.aspx。但是,MS Fakes仅在Visual Studio的几个版本中起作用。

    2023-02-12 17:23 回答
  • 使用MoQ,您可以模拟具体类:

    var mocked = new Mock<MyConcreteClass>();
    

    但这允许您覆盖virtual代码(方法和属性).

    2023-02-12 17:23 回答
  • 我认为最好为该类创建一个接口。并使用界面创建单元测试。

    如果您无权访问该类,则可以为该类创建适配器。

    例如:

    public class RealClass
    {
        int DoSomething(string input)
        {
            // real implementation here
        }
    }
    
    public interface IRealClassAdapter
    {
        int DoSomething(string input);
    }
    
    public class RealClassAdapter : IRealClassAdapter
    {
        readonly RealClass _realClass;
    
        public RealClassAdapter() => _realClass = new RealClass();
    
        int DoSomething(string input) => _realClass.DoSomething(input);
    }
    

    这样,您可以使用IRealClassAdapter轻松为类创建模拟。

    希望它能工作。

    2023-02-12 17:23 回答
  • 只需将您需要伪造的任何方法标记为virtual(而不是私有).然后,您将能够创建一个可以覆盖该方法的假货.

    如果您使用new Mock<Type>并且您没有无参数构造函数,那么您可以将参数作为上述调用的参数传递,因为它需要一种类型的param Objects

    2023-02-12 17:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有