请记住,Rhino 已不再开发1。较新的框架完全放弃了这种模拟存根差异,并为其测试替身引入了单一术语:
模拟框架的演变似乎朝着“一个通用实体”的方向发展,而不是根据测试用例上下文有不同的不同实体。
要了解更多关于这种分离(模拟、存根、伪造)是如何产生的以及它服务的目的,我建议阅读Mark Seemann关于测试替身连续体的文章:
在一个极端,你会发现完全没有实现的假人,而在另一端是完整的生产实现。傻瓜和生产实现都是明确定义的,但存根、间谍和伪造品更难确定:测试间谍什么时候变成伪造品?此外,模拟在连续体中占据相当大的间隔,因为它们在某些情况下可能非常复杂,但在其他情况下却非常简单。
看起来 Rhino 并没有区分 mock 和 stub,但还是有细微差别的。例如,考虑存根属性 getter:
var mock = MockRepository.GenerateMock<IService>();
mock.Stub(m => m.Property).Return(42);
这就是当对象是模拟的时候你必须这样做的。另一方面,存根引入了属性语义,它使整个事情变得微不足道:
var stub = MockRepository.GenerateStub<IService>();
stub.Property = 42;
尽管这是我此刻唯一想到的,但可能还有更多。但是,这些只是细微的差别。
1:截至2013年 5 月 19 日,这可能不再适用:犀牛模拟新家