Mock objects are a useful way to write unit tests for objects that act as mediators. Instead of calling the real
domain objects, the tested object calls a mock domain object that
merely asserts that the correct methods were called, with the expected
parameters, in the correct order. However, when the tested object must
create the domain object, we are faced with a problem. How does the
tested object know to create a mock domain object instead of the true
domain object? In this article, software consultants Alexander Day
Chaffee and William Pietri present a refactoring technique to create
mock objects based on the factory method design pattern.
< ="" ="text/">
Unit testing has become widely accepted as a "best practice" for
software development. When you write an object, you must also provide
an automated test class containing methods that put the object through
its paces, calling its various public methods with various parameters
and making sure that the values returned are appropriate.
When you're dealing with simple data or service objects, writing
unit tests is straightforward. However, many objects rely on other
objects or layers of infrastructure. When it comes to testing these
objects, it is often expensive, impractical, or inefficient to
instantiate these collaborators.
For example, to unit test an object that uses a database, it may be
burdensome to install, configure, and seed a local copy of the
database, run your tests, then tear the local database down again. Mock
objects provide a way out of this dilemma. A mock object conforms to
the interface of the real object, but has just enough code to fool the
tested object and track its behavior. For example, a database
connection for a particular unit test might record the query while
always returning the same hardwired result. As long as the class being
tested behaves as expected, it won't notice the
difference, and the unit test can check that the proper query was
emitted.
|