Rhino Mocks 默认返回类型?

Posted

技术标签:

【中文标题】Rhino Mocks 默认返回类型?【英文标题】:Rhino Mocks default return type? 【发布时间】:2012-01-06 11:35:16 【问题描述】:

为什么 Rhino Mocks(v3.6) 会生成代理类型,当返回类型是接口时,如果你显式指定返回值(我知道你应该总是指定一个返回,但那是一个不同的问题)?

许多网络文章,甚至一些 SO 帖子 RhinoMock : Mocks Vs StrictMocks Vs DynamicMocks,都说模拟将返回默认类型作为其结果,我假设 default(T)。我没有看到这种行为(见下文)。我在Rhino Mocks Documentation 上也找不到任何指定行为的内容。

我还测试过(类似于下面)使用整数类型和类作为返回类型,这两个测试都抛出异常“需要返回值或抛出异常” ,当我尝试在我的 Act 代码中调用该方法时。这我不介意,它明显有什么问题,Rhino 没有“创意”,虽然它是反复无常的 imo。

// Arrange
IFoo strictMockInstance = MockRepository.GenerateStrictMock<IFoo>();
IFoo dynamicMockInstance = MockRepository.GenerateMock<IFoo>();

strictMockInstance.Expect(call => call.Bar());
strictMockInstance.Replay();

dynamicMockInstance.Expect(call => call.Bar());
dynamicMockInstance.Replay();

// Act
IResult smResult = strictMockInstance.Bar();
IResult dmResult = dynamicMockInstance.Bar();

// Assert    
Assert.IsNull(smResult); // none of these results are null, both are proxy instances
Assert.IsNull(dmResult);

// ....
public interface IFoo 

    IResult Bar();


public interface IResult  

【问题讨论】:

Offtopic,Expect()/Call() 不是你在源代码 cmets 中提到的 AAA 语法,请改用 AssertWasCalled() 方法 【参考方案1】:

此功能背后的主要原因是支持(或处理)层次结构

考虑以下几点:

var mock = MockRepository.GenerateMock<ISomeInterface>();
mock.Expect(x => x.Document.Header.CreateRow());

当 Rhino Mocks 遇到作为接口的返回类型时,它会检查是否已经创建了一个 mock。如果它没有找到一个,它将即时创建一个以防止空异常

【讨论】:

以上是关于Rhino Mocks 默认返回类型?的主要内容,如果未能解决你的问题,请参考以下文章

Rhino Mocks - 使用 ref/out 参数模拟集合

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

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

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

如何在 Rhino Mocks 3.6 中将 Expect 设置为扩展方法

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