C++ 模拟系统调用-有更好的方法吗?
我们现在正在公司引入单元测试,并考虑模拟系统调用的最佳方法 考虑以下代码C++ 模拟系统调用-有更好的方法吗?,c++,unit-testing,mocking,C++,Unit Testing,Mocking,我们现在正在公司引入单元测试,并考虑模拟系统调用的最佳方法 考虑以下代码 int fd = open(path, O_RDONLY); if (fd < 0) { LOG.error() << "cannot load plugin " << path << std::endl; return ERROR(ERROR_OPENING_PLUGING); } // do other stuff
int fd = open(path, O_RDONLY);
if (fd < 0) {
LOG.error() << "cannot load plugin " << path << std::endl;
return ERROR(ERROR_OPENING_PLUGING);
}
// do other stuff
这个解决方案很好,但我想它并不适用于所有的编译器
问题是-您在项目中使用的是哪一个?您必须对要模拟的内容和要进行单元测试的内容划清界限。100%的单元测试覆盖率不是最终目标 如果您真的想模拟systam调用,最好是将它们放在包装器中(问题的第一个选项)。不是一个巨大的包装器,但你应该按功能将它们分成几个包装器。(1)关于mock的示例是不正确的,可能是因为你不想澄清你在做什么,并且你的示例没有告诉我什么是mock什么。Mocking实际上是多态性的一个实际例子。人们倾向于将所有内容包装在包装函数中,甚至包装在包装类中
IParam param=new ParamMock(xxx);
File file(param); // mocked
....
file.open(xxx)
(2) 我不知道
(3) 显然,这表明您知道的太多,在单元测试上花费的精力太多。我始终牢记,单元测试终究会被抛弃。
您遵循什么开发过程 系统调用是基础架构
我们使用包装器包装infra logic
还要设计包装器,以便根据上下文可以有许多包装器。
此外,我同意“Bћ”100%的覆盖率不是最终目标——平衡它 我们将切换到Agiley您的问题告诉我提示您正在使用瀑布模型或为已经制作的软件包执行一些升级任务,等等。但是请不要嘲笑遗留代码。。。代码覆盖率通常在70%-85%左右,我们不需要更多的用于单元测试。在您的第一个可交付软件包之后,仍然有报告的bug或缺陷,在下一个可交付软件包中,需要您修复的bug或缺陷更少。您的答案是基于大量意见的,并且没有回答原始问题,即使是远程的。
Common::Error dlopen_signed(ISystem::Ptr& system, const char* path, int flags, void*& ret)
{
int fd = system->open(path, O_RDONLY);
if (fd < 0) {
LOG.error() << "cannot load plugin " << path << std::endl;
return ERROR(ERROR_OPENING_PLUGING);
}
char fd_path[32];
void *
__wrap_malloc (int c)
{
printf ("malloc called with %ld\n", c);
return __real_malloc (c);
}
IParam param=new ParamMock(xxx);
File file(param); // mocked
....
file.open(xxx)