我遇到了 CMockery 模拟的问题,即出现重复符号警告。
代码的实现很长,所以它在 Gist here中。
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()
,它从不使用模拟。
cmockery的谷歌示例太做作了,没有解释应该如何处理这个问题。
将函数声明为 not as 也可能更智能,更容易测试:
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
.