首页 > 解决方案 > 围绕 C++ 代码的 C 包装器的模拟框架

问题描述

我正在开发一个 API,它使用 C 调用约定函数包装 C++ 行为。API 由可用于多种语言的共享库 (dll) 的集合组成。在 C++ 类对象跨越 dll 边界的情况下,使用 C 不透明指针或“句柄”来引用底层 C++ 对象,类似于 Win32 API。这种包装函数的示例头文件原型是

extern "C" { __declspec(dllexport) int __cdecl MyObjConfig(MyObj_t* handle); }

许多 API 函数/类与硬件外围设备接口。在许多情况下,能够在有代表性的硬件系统上进行测试是不切实际的。我想找到一种模拟较低级别组件的方法,以便可以在模拟环境中测试使用这些库的高级库或可执行文件。但是,我不愿意在底层源代码中包含短语,例如

if(is_test) { return 0; }

例如,我想模拟一个函数的行为,float GetSensorData()以便我可以测试一个链接到 GetSensorData 的父 dll 并调用获取传感器数据的可执行文件,方法是返回对传感器正常数据的合理模仿,而无需显式设置传感器。此外,除了确保它链接到 GetSensorData 的 dll 的仿制品之外,我还想避免更改可执行文件的源。

我对创建 dll 模拟的自动化框架感兴趣的一个关键部分是我不想维护每个库的两个单独版本:一个测试版本和一个实际版本。相反,我想处理实际并以编程方式生成“模拟”编译。

谁能提出一个好的方法来做到这一点?我看过 Gtest 和 CMock / Unity。两者似乎都适合自己测试 dll,但似乎没有很好的能力来容纳

extern "C" { __declspec(dllexport) int __cdecl 

函数原型声明。

谢谢!

标签: c++cunit-testingmockingembedded

解决方案


如果您有一个希望模拟的函数位于库中,您可以进行函数指针替换或链接时替换。我在这个答案中更深入地写了它:https ://stackoverflow.com/a/65814339/4441211

我个人推荐函数指针替换,因为它更简单直接。


推荐阅读