CMockery Mock, Duplicate Symbol Error
У меня проблема с макетами CMockery, что появляются предупреждения о дублировании символов.
Реализация кода довольно длинная, так что она в Gist здесь.
Суть включает в себя тест (.c
), реализация (.c
) и заголовочный файл, проект строится с CMake
и проверено с CTest
, с помощью CMockery
,
Фактическая ошибка:
ld: duplicate symbol _wit_configuration_file_path in ../libwatchedit.a(configuration.c.o) and CMakeFiles/libwatcheditTest.dir/configuration_test.c.o for architecture x86_64
Обходной путь, который я смог придумать, был объявить char *wit_configuration_file_path()
как static
, Поскольку реализация находится в том же файле, что и реализация int wit_load_configuration(wit_configuration config)
Я ожидал, что это сработает, на самом деле он компилируется и связывается чисто. К сожалению, хотя и, вероятно, как побочный эффект объявления wit_configuration_file_path()
как статический, он никогда не использует макет.
Примеры Google для cmockery слишком придуманы, и не объяснить, как с этим бороться.
Также возможно, что было бы умнее и проще протестировать объявление функции не как:
int wit_load_configuration(wit_configuration config);
а скорее как:
int wit_load_configuration(char* filepath, wit_configuration, config);
В этом случае мне не нужно что-то издеваться или заглушать; но я верю, что проблема вернется, чтобы укусить меня, так как я ожидаю, что мне нужно будет что-то высмеивать в будущем (иначе как можно написать всесторонние юнит-тесты?)
1: Как я должен сделать это правильно, static
означает, что он никогда не использует мой макет, объявив его без static
вызывает повторяющиеся ошибки символов.
2: я должен изменить дизайн моего API? Это будет работать для этого случая, но я хотел бы знать, как правильно смоделировать функцию.
3: ошибочно ли связывать мои тесты со всей моей библиотекой, я использую CMake и строку target_link_libraries(libwatcheditTest watchedit)
в моем тестеCMakeLists.txt
,
Обновление: я добавил еще несколько результатов сборки для помощи в диагностике
1 ответ
Вы пытаетесь смоделировать * wit_configuration_file_path * с тем же исходным файлом, что и тестируемая функция * wit_load_configuration *. Это невозможно. Компоновщик видит оригинальную реализацию wit_configuration_file_path, а также проверенную версию.
У CMockery довольно узкие рамки для насмешек. В конце концов, вы можете только макетировать полные исходные файлы. Если две функции находятся в одном и том же исходном файле, они либо отключены, либо находятся в "тестируемой системе".
Что делать в этом случае? Не копируйте * wit_configuration_file_path * и не размещайте его в другом исходном файле. Так как * wit_load_configuration * и * wit_configuration_file_path * очень тесно связаны, вероятно, лучшим решением будет не насмешка над функцией.