6 Test doubles and mocks

 

This chapter covers

  • Using stubs, fakes, and mocks to simplify testing
  • Understanding what to mock, when to mock, and when not to mock
  • How to mock the unmockable

Until now, we have been testing classes and methods that were isolated from each other. We passed the inputs to a single method call and asserted its output. Or, when a class was involved, we set up the state of the class, called the method under test, and asserted that the class was in the expected state.

But some classes depend on other classes to do their job. Exercising (or testing) many classes together may be desirable. We often break down complex behavior into multiple classes to improve maintainability, each with a small part of the business logic. We still want to ensure, however, that the whole thing works together; we will discuss this in chapter 9. This chapter focuses on testing that unit in an isolated fashion without caring too much about its dependencies. But why would we want that?

6.1 Dummies, fakes, stubs, spies, and mocks

6.1.1 Dummy objects

6.1.2 Fake objects

6.1.3 Stubs

6.1.4 Mocks

6.1.5 Spies

6.2 An introduction to mocking frameworks

6.2.1 Stubbing dependencies

6.2.2 Mocks and expectations

6.2.3 Capturing arguments

6.2.4 Simulating exceptions

6.3 Mocks in the real world

6.3.1 The disadvantages of mocking

6.3.2 What to mock and what not to mock

6.3.3 Date and time wrappers

6.3.4 Mocking types you do not own

6.3.5 What do others say about mocking?