0

我遇到了 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.

更新:在这里添加了更多构建输出以帮助诊断

4

1 回答 1

0

您尝试使用与被测函数 *wit_load_configuration* 相同的源文件来模拟 *wit_configuration_file_path*。这是不可能的。链接器会看到 wit_configuration_file_path 的原始实现以及模拟版本。

CMockery 有一个非常精细的模拟范围。最后,您只能模拟出完整的源文件。如果两个函数在同一个源文件中,它们要么都被模拟出来,要么都在“被测系统”中。

在这种情况下该怎么办?不要模拟 *wit_configuration_file_path* 或将其放在不同的源文件中。由于 *wit_load_configuration* 和 *wit_configuration_file_path* 高度相关,所以最好不要模拟函数。

于 2012-09-26T11:43:01.613 回答