Recently in a DDD project I needed a mock implementation of a repository interface for implementing my unit tests. In my first attempt I used a simple HashMap for storing my domain objects in my mock implementation. This worked fine in most situations but didn’t behave like the real database implementation in the following case:
- Request object from repository
- Make changes to the object
- Don’t save the object back to simulate cancelation of an editing process by the user
- Request the same object from the repository again
With the real database implementation I would get the object without the changes from the editing process, since the changes never got saved. But in the mock implementation the changes were visible. The reason is simple: Since the mock repository gives me only a reference to the object in the HashMap, all changes to this object are visible to all of the other references.
I found the following solution for this problem: Making deep copies in the mock repository for all objects passed in and out. That way changes to an object are never made to the object in the HashMap until I explicitly save the object.
For making deep copies I used the method described by Philip Isenhour on his website.
A simple mock repository implementation looks like this:
public abstract class MemoryRepositoryBase<K, T> { protected Map<K, T> map = new HashMap<K, T>(); public T findById(K id) { T obj = map.get(id); if (obj != null) { return (T) DeepCopy.copy(obj); } return null; } public void save(T obj) { T copy = (T) DeepCopy.copy(obj); map.put(copy.getId(), copy); }; }