We have a legacy code base in entirely C++. Our build system is CMake. My first stab at unit testing was as follows:
- Define a target (
LibraryA). This library contains the code to test.
- Define a unit test target per CPP test file in
LibraryAbeing tested and link against
Basically the source structure is like so:
LibraryA/ Source/ Utils/ MyClass.cpp MyClass.hpp AnotherClass.cpp AnotherClass.hpp Network/ Socket.cpp Socket.hpp Tests/ Utils/ TestMyClass.cpp TestAnotherClass.cpp
What we have here is a mirror structure of the
Source directory inside
Tests. This structure allows me to use include order trickery at the compiler command line level to prioritize where class headers are found for mocking purposes. Each
Test*.cpp file under
Tests results in 1 executable. So 1 executable test per class being tested.
The issue is that I'm linking against
LibraryA.lib in my test executable. This results in ODR violation because if I want to mock the Socket class, the
LibraryA.lib will have already compiled symbols into it. Now I can't mock it without duplicating symbols and the linker will complain.
Overall setting up unit test structure has been a giant pain from the build system perspective when it comes to mocking.
Is there a good solution to this problem? Is my approach to test structure completely wrong?