我正在使用Windows 7中的C#开发.NET 4.0.
我想测试一些使用mock的方法之间的通信.唯一的问题是我想在没有实现接口的情况下这样做.那可能吗?我刚刚阅读了很多关于模拟对象的主题和一些教程,但是它们都用于模拟接口,而不是类.我尝试使用Rhino和Moq框架.
标准的模拟框架正在创建代理类.这就是他们在技术上限于接口和虚拟方法的原因.
如果您还想模拟"普通"方法,则需要一个可以使用检测而不是代理生成的工具.例如MS Moles和Typemock可以做到这一点.但前者有一个可怕的'API',而后者是商业的.
大多数模拟框架(包括Moq和RhinoMocks)生成代理类作为模拟类的替代,并使用您定义的行为覆盖虚拟方法.因此,您只能在具体或抽象类上模拟接口或虚拟方法.另外,如果你在嘲笑一个具体的类,你几乎总是需要提供一个无参数的构造函数,以便模拟框架知道如何实例化该类.
为什么厌恶在代码中创建接口?
如果您不能更改被测类,那么我建议的唯一选择是使用MS Fakes https://msdn.microsoft.com/en-us/library/hh549175.aspx。但是,MS Fakes仅在Visual Studio的几个版本中起作用。
使用MoQ,您可以模拟具体类:
var mocked = new Mock<MyConcreteClass>();
但这允许您覆盖virtual
代码(方法和属性).
我认为最好为该类创建一个接口。并使用界面创建单元测试。
如果您无权访问该类,则可以为该类创建适配器。
例如:
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轻松为类创建模拟。
希望它能工作。
只需将您需要伪造的任何方法标记为virtual
(而不是私有).然后,您将能够创建一个可以覆盖该方法的假货.
如果您使用new Mock<Type>
并且您没有无参数构造函数,那么您可以将参数作为上述调用的参数传递,因为它需要一种类型的param Objects