Stop.Mocking.EVERYTHING

I've flip flopped on how to use mock objects since 2008. It's took me nearly five years to finally claim to have a solid, practical answer on what is in my opinion, their correct use.

Mock Everything

Some developers told me to mock everything. Every. Single. Collaborator. I wasn't sure about this approach.

Mock Nothing

Some developers told me to mock nothing. Sometimes I never used mocks. I wasn't sure about this approach either.

No wonder I was confused. Neither approach seemed to be comfortable with me.

Solution

This halfway house is built around the idea of command and query separation as detailed by Mark Seeman. This simple principle makes a lot of sense, and finally helped me realise how best to use stubs and mocks.

If the collaborator is not significant, or in other words is simply an implementation detail then no mock or stub is needed. That's right, just new up (or instantiate) your dependency there and then. This allows you to refactor the internals aggressively, without the fear of breaking or rewriting tests.

This approach has served me well for a while now, and in fact can be achieved even without the need to use a complicated mocking framework, though that will be the subject of a future post.