【问题标题】:CMockery Mock, Duplicate Symbol ErrorCMockery 模拟,重复符号错误
【发布时间】:2011-12-18 14:57:59
【问题描述】:

我在使用 CMockery 模拟时遇到问题,即出现重复符号警告。

代码的实现比较长,so it's in a 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() 声明为静态的副作用,它从不使用模拟。

google examples for 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,以及 my test's CMakeLists.txt 中的 target_link_libraries(libwatcheditTest watchedit) 行。

更新:我添加了一些more build output here for help with diagnosis

【问题讨论】:

    标签: c linker cmake working-set cmockery


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 dmeister!是否有更细粒度的模拟或 C 库?我一直在使用 CMake 进行构建,Make 似乎更适合,以及 CMockery,因为它是 CMake 推荐的,但我没有加入(并且在过去 10 个月中搁置了这个副项目)!
    • 不,我不知道。用 C 做起来相当困难。
    • 干杯 dmeister!是的,mock 和 stubing 相当棘手,使用外部工具进行验收测试更容易接受!
    猜你喜欢
    • 2016-09-24
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多