c++testingdependency-injectiontestability

Patterns for making c++ code easy to test


Should you design your code to make testing easier? And if so how to design c++ code so that it is easy to test.


Solution

  • Should I implement the classes using a pure interface class as the base in order to simplify the creation of fake test objects?

    • That would force me into making a lot of virtual methods. Will that affect performance?

    A workaround I often use is to templatize the class instead of hiding it behind an interface. Then I can pass test/mock objects as template parameters when testing, and the real objects otherwise. That way, the performance hit of virtual functions is avoided.

    Edit
    Ok, a simple example:

    With OOP and interfaces, you might write a function such as this:

    void Foo(IBar& someBar) { ... }
    

    This function takes a parameter which implements the IBar interface, and does something with it. If you want to pass in a dummy mock implementation, you simply write a mock object which inherits from IBar and pass that to Foo. Simple and straightforward.

    But you can achieve the same thing with templates:

    template <typename BarType>
    void Foo(BarType& someBar) { ... }
    

    ... and that's it. The body of Foo can be pretty much unchanged. As long as the type passed to the function exposes all the members we need, it'll work, without having to formally inherit from an interface class, and without the overhead of virtual functions and runtime polymorphism.