Исключение множественного определения для инфраструктуры модульного тестирования CppUTest

Я постараюсь сделать этот пример с минимальными затратами как можно более применимым для как можно большего числа людей, а также защитить любой вид совместного использования кода, который может нарушить NDA. Надеюсь, это нормально!

Я использую CppUTest и CppUMock (компилируем с gcc / g ++ и make-файлами, созданными с помощью CMake) в сочетании с программным обеспечением Gitlab Continuous Integration для создания среды модульного тестирования для будущих коммитов и выпуска программного обеспечения. Однако я столкнулся с небольшой проблемой. Допустим, у меня есть следующая настройка папки (которую я могу изменить минимально, кроме содержимого папки / tests):

+-- src
+-- driver1.c
+-- driver2.c
+-- inc
+-- driver1.h
+-- driver2.h
+-- tests
+-- test_driver1.cpp
+-- test_driver2.cpp
+-- main.cpp
+-- cmakelists.txt

Файл CMakeLists будет содержать папку inc, компиляцию папки src и компиляцию папки tests. Однако, допустим, что driver2.c использует методы, определенные driver1.c. Это нормально, если нет настройки насмешки, потому что вы можете просто протестировать результаты вызовов методов driver2 в обычном режиме. Однако, скажем, что я хочу смоделировать функцию method1 driver1, чтобы я мог проверить, что driver2 правильно вызывает method1 (используя CppUMock). Это обычно будет хорошо, если driver1 не компилируется, а добавляет что-то вроде этого в файл test_driver2.cpp:

void method1(int n) {
mock().actualCall("method1").withParameter("n", n);
}

Вызовет конфликт с фактическим method1 в driver1.c с ошибкой компоновщика, например:

CMakeFiles/Tests.dir/.../src/driver1.c:(.text+0x11d): multiple definition of 'method1'
CMakeFiles/Tests.dir/.../src/test_driver2.cpp:(.text+0x0): first defined here

В соответствии с запросом комментатора, вот как выглядит структура include:

driver1.c includes driver1.h (obviously)
driver2.c includes driver2.h (obviously)
driver2.h includes driver1.h (for calling method1)
test cpp files include their respective .h files
(test_driver1.cpp -> driver1.h and test_driver2.cpp -> driver2.h)

method1 объявлен в driver1.h и определен в driver1.c. Я не могу редактировать эти файлы.

Я рад добавить детали в соответствии с просьбой.

Как лучше всего обойти эту насмешливую проблему?

6

Решение

Если вы хотите издеваться method1 от driver1.hПросто добавьте макетированное определение в отдельный mock_driver1.cpp, а затем в свой CMakeLists.txt:

add_executable(target1 test_driver1.cpp driver1.cpp)
add_executable(target2 test_driver2.cpp driver2.cpp mock_driver1.cpp)

Как только вы закончите издеваться, заменить mock_driver1.cpp зависимость с driver1.cpp,

Все это предполагает, что у вас есть отдельный исполняемый файл для каждого тестового драйвера.

Однако, если вы хотите иметь одну большую основную программу, в которой все драйверы связаны друг с другом, то вы не можете иметь оба настоящих method1 и издевались method1 сосуществовать вместе. Для этого я бы рекомендовал обернуть издевались method1 в пространстве имен mock или что-то подобное, и только позвонить mock::test1 в test_driver2.cpp.

3

Другие решения

Других решений пока нет …