To be able to unit test my C++ code I usually pass the constructor of the class under test one or several objects that can be either "production code" or fake/mock objects (let's call these injection objects). I have done this either by
- Creating an interface that both the "production code" class and the fake/mock class inherits.
- Making the class under test a template class that takes the types of the injection objects as template parameters, and instances of the injection objects as parameters to the constructor.
Some random thoughts:
- Until we have concepts (C++0x), only documentation and parameter naming will hint what to provide the class under test (when using templates).
- It is not always possible to create interfaces for legacy code
- The interface is basically only created to be able to do dependency injection
- In the same way: templating the class under test is done only to enable dependency injection
What are your thoughts? Are there other solutions to this problem?