使用 GoogleMock,您可以伪造类的虚拟方法。但是 ::dbus_* 函数不是任何类的成员(你是对的,它们位于命名空间中:全局命名空间)。所以你不能(直接)使用 GoogleMock。
James W. Grenning 在嵌入式 C 的测试驱动开发中为您的问题提出了一些解决方案:
- 链接时替换:不要将测试代码链接到包含 ::dbus_* 函数代码的原始库,而是在测试项目中创建新的 C/CPP 文件,这些文件实现了所有 ::dbus_* 函数使用的伪造品被测组件。还将被测组件添加到测试项目中,因此链接器将自动解析 ::dbus_* 对您的假货的调用。
- 函数指针替换:不要直接使用被测组件中的 ::dbus_* 函数,而是使用函数指针,这些函数指针在生产代码中初始化为 ::dbus_* 函数,在测试代码中初始化为假函数。
- 预处理器替换:用于
#define
覆盖名称,例如#define dbus_message_unref(p) fake_dbus_message_unref(p)
使被测组件调用您自己的假函数fake_dbus_message_unref()
。这种方法需要将被测组件添加到测试项目中。
如果提案 1. 可行并且不会产生链接问题,那么它比提案 2 的工作量要少得多。提案 3. 的俗气部分是它实际上更改了(!)被测组件的代码,所以我宁愿害羞远离 3.建议 1. 是推荐的方式。
Another alternative could be to use C++ wrapper classes with virtual methods around the ::dbus_* functions, so you can use a mocking tool like GoogleMock to fake them. Writing such wrappers would probably mean quite some effort. As short cut you could search for a DBUS C++ wrapper library -- if you are lucky you find a mockable one.