使用 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 将需要您为任何非空构造函数提供参数,因为它不知道如何构建它们。

我的错误是我试图将空值传递给CreateMockGenerateMock 调用,一旦我为构造函数生成了一个非空参数,创建模拟或存根的调用就开始工作了。

【讨论】:

【参考方案3】:

您必须在您的DynamicMock&lt;T&gt; 语句之后将它们传入,该语句将参数数组作为参数。不幸的是,没有对其进行类型检查,但如果您将参数与签名匹配,它将调用适当的构造函数。

例如:

var myMock = MockRepository.DynamicMock<MyClassWithVirtuals>(int x, myObj y);

【讨论】:

以上是关于使用 RhinoMocks,如何在没有空构造函数的情况下模拟或存根具体类?的主要内容,如果未能解决你的问题,请参考以下文章

如何允许我的模板化 Vector 允许没有默认(空)构造函数的类型?

超类没有空构造函数,但没有给出参数

Android IntentService 无法实例化类;没有空的构造函数

为啥 C++ 映射类型参数在使用 [] 时需要一个空的构造函数?

=default 和没有参数的空构造函数之间的区别? [复制]

如何在 Kotlin Android 中为数据类创建空构造函数