2012-12-06 22 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 *庫函數編寫一個包裝類,並且會嘲笑它。 –

相關問題