Я постараюсь сделать этот пример с минимальными затратами как можно более применимым для как можно большего числа людей, а также защитить любой вид совместного использования кода, который может нарушить 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. Я не могу редактировать эти файлы.
Я рад добавить детали в соответствии с просьбой.
Как лучше всего обойти эту насмешливую проблему?
Если вы хотите издеваться 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.
Других решений пока нет …