使用 RhinoMocks,如何在没有空构造函数的情况下模拟或存根具体类?
Posted
技术标签:
【中文标题】使用 RhinoMocks,如何在没有空构造函数的情况下模拟或存根具体类?【英文标题】:Using RhinoMocks, how do you mock or stub a concrete class without an empty constructor? 【发布时间】:2009-08-17 23:50:34 【问题描述】:当你的类上有一个空的构造函数时,用 Rhino Mocks 模拟一个具体的类似乎很容易:
public class MyClass
public MyClass()
但是如果我添加一个带参数的构造函数并删除不带参数的构造函数:
public class MyClass
public MyClass(MyOtherClass instance)
我倾向于得到一个例外:
System.MissingMethodException:不能 找到匹配的构造函数 论据
我尝试在对 Mock 或 Stub 的调用中放入空值,但它不起作用。
我可以创建缺少无参数构造函数的具体类的模拟和存根吗?
【问题讨论】:
【参考方案1】:是的。只需在您的StrictMock()
调用中传入参数即可:
// New FruitBasket that can hold 50 fruits.
MockRepository mocks = new MockRepository();
FruitBasket basket = mocks.StrictMock<FruitBasket>(50);
【讨论】:
和编译时安全性消失了【参考方案2】:如果你模拟一个没有空/默认构造函数的具体类,那么 Rhino Mocks 将不得不使用任何其他可用的构造函数。 Rhino 将需要您为任何非空构造函数提供参数,因为它不知道如何构建它们。
我的错误是我试图将空值传递给CreateMock
或GenerateMock
调用,一旦我为构造函数生成了一个非空参数,创建模拟或存根的调用就开始工作了。
【讨论】:
【参考方案3】:您必须在您的DynamicMock<T>
语句之后将它们传入,该语句将参数数组作为参数。不幸的是,没有对其进行类型检查,但如果您将参数与签名匹配,它将调用适当的构造函数。
例如:
var myMock = MockRepository.DynamicMock<MyClassWithVirtuals>(int x, myObj y);
【讨论】:
以上是关于使用 RhinoMocks,如何在没有空构造函数的情况下模拟或存根具体类?的主要内容,如果未能解决你的问题,请参考以下文章
如何允许我的模板化 Vector 允许没有默认(空)构造函数的类型?
Android IntentService 无法实例化类;没有空的构造函数
为啥 C++ 映射类型参数在使用 [] 时需要一个空的构造函数?