Since testing classes in isolation is a good thing it is sometimes 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 the links (copied from Genna)This is a quick how-to stub with RhinoMocks.many posts (see Gena'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.Without further redo a few handy usages :
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:
Code Block |
---|
private static readonly MockRepository mocks = new MockRepository();
|
Properties with getter/setter
...
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
...
Code Block |
---|
var mock = mocks.Stub<IInterface>(); mock.Go(); |
Mocking method with return values
What if you need a method to return a specific value?
Code Block |
---|
interface IInterface
{
string GetMyString();
}
|
Use like:
Code Block |
---|
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
Code Block |
---|
interface IInterface
{
string GetMyString(string a);
}
|
Always returning the same value
Code Block |
---|
var mock = mocks.Stub<IInterface>();
mock.Stub(a => a.GetMyString(null)).IgnoreArguments().Return("kees");
mocks.ReplayAll();
|
Returning based on input
Code Block |
---|
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
Helping the mock object out of its verified state
Suppose you have the System.InvalidOperationException: This action is invalid when the mock object is in verified state
You can't use a mock in Rhino Mocks after its expectations were verified, even if you're calling a method that does not make part of your expectations.
To solve this use the following:
Code Block |
---|
[TearDown]
public void TearDown()
{
mocks.BackToRecordAll();
if (testee != null)
testee.Dispose();
}
[Test]
public void Test()
{
// Expectations setup
someInterface.DoStuff();
mocks.ReplayAll();
// Replay
testee.SomeInterface = _someInterface;
testee.DoSomeOtherStuff();
mocks.VerifyAll();
}
|