2012-12-06 25 views
0

说我有一类用下面的代码如何(Google)模拟DBUS界面?

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

回答

2

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

詹姆斯·Grenning在嵌入式C测试驱动开发提出您的问题的一些解决方案:

  1. 链接时替换:不要对包含原始链接库的测试代码:: dbus_ *函数代码,而是在测试项目中创建新的C/CPP文件,该文件实现了被测组件使用的all :: 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.是推荐的方法。

另一种方法是在:: dbus_ *函数中使用带有虚拟方法的C++包装类,因此可以使用像GoogleMock这样的模拟工具来伪造它们。写这样的包装可能意味着很大的努力。简而言之,您可以搜索DBUS C++包装库 - 如果幸运的话,您可以找到一个可嘲弄的包装库。

+0

我正在为dbus *库函数编写一个包装类,并且会嘲笑它。 –

相关问题