Skip to end of metadata
Go to start of metadata

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 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.

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 (wink) . 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();

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 (smile)

        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

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:

[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();
        }