小编Jef*_*rey的帖子

CppUTest单元测试框架多重定义异常

我将尝试将此作为一个纯粹的最小示例,以尽可能适用于尽可能多的人,并保护可能违反NDA的任何类型的代码共享.希望这没关系!

我使用CppUTest和CppUMock与Gitlab持续集成软件结合使用(与CMake的创建的gcc/g ++以及makefile文件编译)为未来的承诺和软件版本创建单元测试环境.但是,我遇到了一些问题.假设我有以下文件夹设置(除了/ tests文件夹的内容之外,我具有最小的更改能力):

+-- src
    +-- driver1.c
    +-- driver2.c
+-- inc
    +-- driver1.h
    +-- driver2.h
+-- tests
    +-- test_driver1.cpp
    +-- test_driver2.cpp
    +-- main.cpp
    +-- cmakelists.txt
Run Code Online (Sandbox Code Playgroud)

CMakeLists文件将包含inc文件夹的包含,src文件夹的编译以及tests文件夹的编译.但是,假设driver2.c依赖于driver1.c定义的方法.如果没有模拟设置,这很好,因为你可以正常测试对driver2方法的调用结果.但是,假设我想模拟driver1的method1函数,以便我可以检查driver2是否正确调用了method1(使用CppUMock).如果没有编译driver1,那么通常会没问题,但是在test_driver2.cpp文件中添加类似的内容:

void method1(int n) {
    mock().actualCall("method1").withParameter("n", n);
}
Run Code Online (Sandbox Code Playgroud)

将导致与driver1.c中的实际method1发生冲突,并发生链接器错误,如下所示:

CMakeFiles/Tests.dir/.../src/driver1.c:(.text+0x11d): multiple definition of 'method1'
CMakeFiles/Tests.dir/.../src/test_driver2.cpp:(.text+0x0): first defined here
Run Code Online (Sandbox Code Playgroud)

根据评论者的要求,包含结构如下:

driver1.c includes driver1.h (obviously)
driver2.c includes driver2.h (obviously)
driver2.h includes driver1.h (for calling method1)
test cpp files include their respective .h files
(test_driver1.cpp -> driver1.h and test_driver2.cpp -> driver2.h)
Run Code Online (Sandbox Code Playgroud)

method1在driver1.h中声明并在driver1.c中定义.我无法编辑这些文件.

我很乐意按要求添加详细信息.

解决这个嘲弄问题的最佳方法是什么?

c c++ unit-testing cpputest

6
推荐指数
1
解决办法
692
查看次数

标签 统计

c ×1

c++ ×1

cpputest ×1

unit-testing ×1