0

假设我有一个带有以下代码的课程

void MessageBuilder::Init(DBusMessage* pMsg)
{
    if (NULL != m_pMsg)
    {
        ::dbus_message_unref(m_pMsg);
    }
    // m_pMsg is a private data member
    m_pMsg = pMsg;
    ::dbus_message_iter_init_append(m_pMsg, &m_objArgs);
}

DBUS 调用位于命名空间中,因此是 ::(我相信)。谁能建议如何模拟/存根 ::dbus_* 调用?

4

1 回答 1

3

使用 GoogleMock,您可以伪造类的虚拟方法。但是 ::dbus_* 函数不是任何类的成员(你是对的,它们位于命名空间中:全局命名空间)。所以你不能(直接)使用 GoogleMock。

James W. Grenning 在嵌入式 C 的测试驱动开发中为您的问题提出了一些解决方案:

  1. 链接时替换:不要将测试代码链接到包含 ::dbus_* 函数代码的原始库,而是在测试项目中创建新的 C/CPP 文件,这些文件实现了所有 ::dbus_* 函数使用的伪造品被测组件。还将被测组件添加到测试项目中,因此链接器将自动解析 ::dbus_* 对您的假货的调用。
  2. 函数指针替换:不要直接使用被测组件中的 ::dbus_* 函数,而是使用函数指针,这些函数指针在生产代码中初始化为 ::dbus_* 函数,在测试代码中初始化为假函数。
  3. 预处理器替换:用于#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.

于 2012-12-07T14:18:51.910 回答