Say you're testing class A
and it has a dependency injection of B
which has a dependency injection of C
.
So you mock B
but the only constructor it has requires an injection of C
, so do you have to mock C
as well and inject the mocked C
into the mocked B
and only then inject it to A
?
What if you have 5 consecutive dependancies?
What are the alternatives?
I use Google Mock, so a specific answer would help as well.
If you change the design so that the classes depend on interfaces instead of concrete classes, you get rid of the constructor problems. Besides improving testability, it may also improve reusability and maintainability, at the cost of more code (interfaces).
In this case you should inject by pointer and not by reference, then you could pass a NULL pointer. This would work assuming you're object is indeed a mock and not a fake object, therefore it has no real dependency on the injected object.
For
boost::shared_ptr
you could do the following:Emile has the right idea, you should depend on interfaces not concrete classes. So in your example it would be something like:
In your tests you create a mock B which does not rely on any class C. Then you are only testing the interface with B. In this way you break A's dependency on C. Creating a mock B that doesn't depend on C is pretty simple: