У меня проблема с CMockery mocks, что есть повторяющиеся предупреждения о символах.CMockery Mock, Duplicate Symbol Error
Реализация кода довольно длинная, so it's in a Gist here.
суть включает тест (.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 examples for cmockery слишком надуманный и не объясняет, как с этим бороться.
Это также возможно, что это было бы умнее и проще проверить, чтобы объявить функцию не как:
int wit_load_configuration(wit_configuration config);
, а скорее как:
int wit_load_configuration(char* filepath, wit_configuration, config);
В этом случае, я не нужно что-нибудь издеваться или заглушить; но я верю, что проблема вернется, чтобы укусить меня, поскольку я ожидаю, что мне нужно будет что-то издеваться в будущем (иначе как можно написать исчерпывающие модульные тесты?)
: Как мне это сделать? это правильно, static
означает, что он никогда не использует мой макет, объявляя его без static
, вызывает дублирующиеся ошибки символов.
: Следует ли мне изменить дизайн моего API? Это будет работать для этого случая, но я хотел бы знать, как правильно издеваться над функцией.
: Является ли это ошибка связывать мои тесты против всей моей библиотеки, я использую CMake, и линия target_link_libraries(libwatcheditTest watchedit)
в my test's CMakeLists.txt
.
Update: Я добавил некоторые more build output here for help with diagnosis
Спасибо, dmeister! Есть ли более тонкая штукатурка или библиотека для C? Я использовал CMake для сборки, для чего Make лучше подходит, и CMockery, потому что он был рекомендован CMake, но я не привязан (и отложил этот боковой проект за последние 10 месяцев)! –
Нет, я не знаю. Это довольно сложно сделать с C. – dmeister
Cheers dmeister! Да, насмешливость и укутывание довольно сложно, тестирование с помощью внешних инструментов для принятия немного более доступно! –