无法使用 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:实例化 Mock 属性,以便 Expectation 可以引用它
为啥我的 Rhino Mocks Partial Mock 方法调用没有被模拟?