Unit testing 如何(Google)模拟DBUS接口?

Unit testing 如何(Google)模拟DBUS接口?,unit-testing,googlemock,Unit Testing,Googlemock,假设我有一个具有以下代码的类 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_objAr

假设我有一个具有以下代码的类

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_*调用吗?

使用GoogleMock,您可以模拟类的虚拟方法。但是::dbus_*函数不是任何类的成员(没错,它们在一个名称空间中:全局名称空间)。因此,您不能(直接)使用GoogleMock

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

  • 链接时间替换:不要将测试代码链接到包含::dbus_*函数代码的原始库,而是在测试项目中创建新的C/CPP文件,该文件实现被测试组件使用的所有::dbus_*函数的伪造。还要将测试中的组件添加到测试项目中,这样链接器将自动解析对您的fakes的::dbus_*调用
  • 函数指针替换:不直接使用测试组件中的::dbus_*函数,而是使用函数指针,这些函数指针在生产代码中初始化为::dbus_*函数,在测试代码中初始化为假函数
  • 预处理器替换:使用
    #define
    覆盖名称,例如
    #define dbus_message_unref(p)fake_dbus_message_unref(p)
    使被测组件调用您自己的伪函数
    fake_dbus_message_unref()
    。这种方法需要将被测组件添加到测试项目中
  • 如果建议1。是可行的,不会产生链接问题,比方案2的工作量小得多。提案3的俗气部分。它实际上改变了(!)被测组件的代码,所以我宁愿避开3建议1。是推荐的方式。


    另一个替代方法是使用C++方法包装类:在::dBuSy**函数周围,这样你就可以使用像GoGoMeLokes这样的嘲弄工具来伪造它们。编写这样的包装可能需要相当多的努力。你可以搜索一个DBUS C++包装库——如果你运气好,你可以找到一个可模仿的。但是::dbus_*函数不是任何类的成员(没错,它们在一个名称空间中:全局名称空间)。因此,您不能(直接)使用GoogleMock

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

  • 链接时间替换:不要将测试代码链接到包含::dbus_*函数代码的原始库,而是在测试项目中创建新的C/CPP文件,该文件实现被测试组件使用的所有::dbus_*函数的伪造。还要将测试中的组件添加到测试项目中,这样链接器将自动解析对您的fakes的::dbus_*调用
  • 函数指针替换:不直接使用测试组件中的::dbus_*函数,而是使用函数指针,这些函数指针在生产代码中初始化为::dbus_*函数,在测试代码中初始化为假函数
  • 预处理器替换:使用
    #define
    覆盖名称,例如
    #define dbus_message_unref(p)fake_dbus_message_unref(p)
    使被测组件调用您自己的伪函数
    fake_dbus_message_unref()
    。这种方法需要将被测组件添加到测试项目中
  • 如果建议1。是可行的,不会产生链接问题,比方案2的工作量小得多。提案3的俗气部分。它实际上改变了(!)被测组件的代码,所以我宁愿避开3建议1。是推荐的方式。


    另一个替代方法是使用C++方法包装类:在::dBuSy**函数周围,这样你就可以使用像GoGoMeLokes这样的嘲弄工具来伪造它们。编写这样的包装可能需要相当多的努力。作为快捷方式,您可以搜索DBUS C++包装库——如果您幸运的话,您可以找到一个可模仿的。

    我正在为DBUS *函数编写包装类,并将对此进行模拟。我正在为DBUS *库函数编写包装类,并将对此进行模拟。