Since testing classes in isolation is a good thing it is nice to be able to have a quick dummy implementation of an interface without having to instantiate the object (and needing a reference to a concrete class). Why mocking is good can be found in many posts (see genna's post here http://wiki.deltares.nl/pages/viewpage.action?pageId=5272)
What is stubbing? Stubbing is quickly creating dummy instances of interfaces. Stubs are not used to test behaviour (calls on objects). Mocks are used for that.
This is a quick how-to stub with RhinoMocks. It is meant as a reference. When you want something stubbed-out in your test and don't know the syntax it might be here (hopefully . In that it would be nice to expand this post.
Setting it up.
To stub you need a mockrepository. Set it up some where in your (test)class:
private static readonly MockRepository mocks = new MockRepository();
Without further redo a few handy usages :
Properties with getter/setter
interface IInterface { string Name{ get;set; } }
Can be used directly since the default property behaviour of stubs gives us a getter setter
var mock = mocks.Stub<IInterface>(); mock.Name = "lee";
Readonly properties
Given an interface with a readonly property:
interface IInterface { string ReadOnly { get; } }
We can use it like this in test
var mock = mocks.Stub<IInterface>(); mock.Stub(a => a.ReadOnly).Return("kees"); mocks.ReplayAll();//don't forget or you will get null
Unfortunately our syntax gets more complex and we need to turn on the stub using
mocks.ReplayAll();
Mocking void methods
Methods without return values are easy. You get default implementation doing nothing
interface IInterface { void Go(); }
We can use it like this in test
var mock = mocks.Stub<IInterface>(); mock.Go();
Mocking method with return values
What if you need a method to return a specific value?
interface IInterface { string GetMyString(); }
Use like:
var mock = mocks.Stub<IInterface>(); mock.Stub(a => a.GetMyString()).Return("kees"); mocks.ReplayAll();//don't forget or you will get null
Mocking methods with parameters and return values
interface IInterface { string GetMyString(string a); }
Always returning the same value
var mock = mocks.Stub<IInterface>(); mock.Stub(a => a.GetMyString(null)).IgnoreArguments().Return("kees"); mocks.ReplayAll();
Returning based on input
mock.Stub(a => a.GetMyString("rock")).IgnoreArguments().Return("paper"); mock.Stub(a => a.GetMyString("paper")).IgnoreArguments().Return("scissor"); mocks.ReplayAll();
Resulting in rock->paper and paper->scissor