Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 是否可以在不使用gmock修改源代码的情况下模拟系统调用(例如:malloc)?_Unit Testing_Malloc_System Calls_Googletest_Googlemock - Fatal编程技术网

Unit testing 是否可以在不使用gmock修改源代码的情况下模拟系统调用(例如:malloc)?

Unit testing 是否可以在不使用gmock修改源代码的情况下模拟系统调用(例如:malloc)?,unit-testing,malloc,system-calls,googletest,googlemock,Unit Testing,Malloc,System Calls,Googletest,Googlemock,我想模拟系统调用,例如malloc/file open,以便在不修改生产代码的情况下对代码进行单元测试。 此外,在源代码中为这些系统调用创建包装器是不可行的,因此该选项被排除在外 对的任何输入/解决方案都会有所帮助。模拟系统调用是有问题的,因为gtest和gmock本身也可能使用相同的函数。而且,由于在源代码中包装它们也不是一个选项,所以可能没有太多的可能性了 在编译源代码文件时,可以尝试使用预处理器替换这些调用。它不符合标准,但通常可以工作。假设需要测试的代码位于文件foo.cpp中。此文件f

我想模拟系统调用,例如malloc/file open,以便在不修改生产代码的情况下对代码进行单元测试。 此外,在源代码中为这些系统调用创建包装器是不可行的,因此该选项被排除在外


对的任何输入/解决方案都会有所帮助。

模拟系统调用是有问题的,因为gtest和gmock本身也可能使用相同的函数。而且,由于在源代码中包装它们也不是一个选项,所以可能没有太多的可能性了

在编译源代码文件时,可以尝试使用预处理器替换这些调用。它不符合标准,但通常可以工作。假设需要测试的代码位于文件
foo.cpp
中。此文件
foo.cpp
包括
a.h
b.h
以及
malloc

您想做的是定义malloc malloc#u mock,但要使其工作(至少有可能——正如我所说,这是一种不合规的黑客行为),您必须在文件
foo_test.cpp
中按以下方式进行:

#include <a.h>      // before malloc is re-defined
#include <b.h>      // also before re-defining malloc
#include <cstdlib>  // and again
// Now all files are included that foo.cpp also includes.
// Let's hope every file has an include-guard in place ...

void* malloc_mock (size_t size);

#define malloc malloc_mock
// now, in the code of foo.cpp, all calls to malloc are substituted:
#include "foo.cpp" // include guards protect a.h etc. from being affected 
#undef malloc

... your tests come here
#在重新定义malloc之前包含//
#在重新定义malloc之前,还包括//
#包括//并再次
//现在,foo.cpp也包含了所有文件。
//希望每个文件都有一个include守卫。。。
void*malloc\u mock(尺寸);
#定义malloc malloc_mock
//现在,在foo.cpp的代码中,对malloc的所有调用都被替换:
#包括“foo.cpp”//包括保护a.h.等免受影响的防护装置
#未定义malloc
... 你的测验来了
丑陋?当然但是,限制来自你,所以不要要求漂亮的东西

只是附带说明:在mock
malloc
的特殊情况下,我假设您正在尝试实现一些内存泄漏检查-如果是这样,我建议不要模拟它,而是在valgrind下运行您的单元测试