You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 18 Next »

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 in your test and dont know the syntax. 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 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 (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

  • No labels