无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类

Posted

技术标签:

【中文标题】无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类【英文标题】:Cannot mock class with constructor having array parameter using Rhino Mocks 【发布时间】:2010-05-18 07:35:04 【问题描述】:

我们无法在 RhinoMocks 中模拟这个类。

public class Service

    public Service(Command[] commands)

public abstract class Command 

// Code
var mock = MockRepository.GenerateMock<Service>(new Command[]); // or
mock = MockRepository.GenerateMock<Service>(null)

Rhino 模拟失败,抱怨找不到具有匹配参数的构造函数。 我做错了什么?

谢谢,

【问题讨论】:

【参考方案1】:

试试这样:

var mock = MockRepository.GenerateMock<Service>(
    new object[]  new Command[0] 
);

【讨论】:

【参考方案2】:

此外,您可以使用接口包装 Service 而不必担心构造函数参数。如果构造函数发生变化——您的测试将与这些实现细节相关联并且需要更新。

var mock = MockRepository.GenerateMock<IService>();

编辑:至少隔离该 Mock 的创建,因此如果您在 Service 上的构造函数发生更改,您不必在每个地方都进行更新。一种常见的做法如下:

(在你的测试课中)

private ObjectWithServiceDependency CreateObjectUnderTest()
     //Here you would inject your Service dependency with the above answer from Darin
     //i.e.
     var mockService= MockRepository.GenerateMock<Service>(new object[] new Command[0] );
     var objectUnderTest = new ObjectWithServiceDependency(mockService);
     return objectUnderTest;

然后在测试中,

[Test]
public TestSomething()
     var out = CreateObjectUnderTest();
     //do testing
     mockService.Expect(...);

【讨论】:

为了模拟,我不是接口的最大粉丝。但是,您将拥有与知道构造函数参数和类型的测试相关的技术债务。我将编辑我的示例,以展示一个好的做法,至少在构造函数需要更改时隔离需要更改的地方。

以上是关于无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rhino Mocks 模拟任意行为?

Rhino Mocks:实例化 Mock 属性,以便 Expectation 可以引用它

Rhino Mocks 存根和模拟仅适用于接口?

为啥我的 Rhino Mocks Partial Mock 方法调用没有被模拟?

Rhino Mocks 上的 mock 和 stub 有啥区别?

Rhino Mocks 默认返回类型?