I dislike using mocks I dislike using dynamic mocking/stubbing frameworks. because it means my tests have an extra dependency beyond just the SUT (System Under Test). I often find myself spending more time getting the mock to work correctly rather than my app code. The lambada + generics based Mock suites (Moq, RhinoMocks, etc), IMO, complicate the test and make them unreadable in some situations.
Compare the two examples in this post. One uses RhinoMocks to create a stub of IDataReader and the other uses the DataTableReader to create a stub for the test. Which example is simpler and has less chance to fail due to the stub?
IDataReader reader = MockRepository.GenerateStub<IDataReader>(); reader.Stub(x => x.Read()).Return(true).Repeat.Times(1); reader.Stub(x => x.Read()).Return(false); reader.Stub(x => x["ID"]).Return(Guid.Empty); reader.Stub(x => x["FullName"]).Return("Test User");
DataTable table = new DataTable(); DataRow row = table.NewRow(); table.Columns.Add(new DataColumn("ID")); table.Columns.Add(new DataColumn("FullName")); row["DirectoryUserID"] = Guid.Empty; row["FullName"] = "Test User"; table.Rows.Add(row); DataTableReader reader = new DataTableReader(table);
Stubs/Fakes allow me more control over HOW the test fails and results in a test/fixture that is easier to read. I’m not saying that mocks aren’t useful in certain situations, but I would favor a stub over a mock IMO, your test should only fail because of the code it is testing, not because of a mock.
Although it is fun to say "Mock ME? No mock YOU!".
update: I forgot to link to Rob’s post that inspired this post. “Using Dependency Injection and Mocking For Testability”
update to the update: Jeremy Miller and Nikola Malovic both pointed out that I’m using the terminology incorrectly. It turns out I don’t specifically hate mocks themselves, I dislike use dynamic mocking/stubbing frameworks due to the extra dependency they introduce into my tests. Thanks for the corrections. Back to reading Fowler for me!