[英]Can a header with declared functions be mocked?
我正在從事一個針對 Silicon Labs 微控制器的項目。 我想為藍牙 SDK 調用創建一個包裝器。 SDK 庫依賴很重,因此通過在該界面中創建外觀,我可以避免將它們添加到我的測試中。 請注意,此問題並非特定於 Silicon Labs 平台,但我將保留 SiLabs SDK 文件名,以防讀者熟悉該平台。
我使用 CPPUTest 作為我的測試框架。 我的代碼是 C 和 C++ 的混合,但就這個問題而言,它是 C。
例如,我的一個包裝函數(在一個名為Bluetooth_HW
的模塊中)將是
/* On "Bluetooth_HW.c" */
#include "native_gecko.h" // declares gecko_cmd_le_gap_bt5_set_adv_data()
// Set a new advertisement, either as advertisement packet or as a response.
bool BT_setAdvertisementMessage(uint8_t scanResponse, uint8_t adLength, uint8_t* newAdvertisement) {
uint16_t result = gecko_cmd_le_gap_bt5_set_adv_data(0, scanResponse, adLength, newAdvertisement)->result;
if (result != bg_err_success) {
return false;
} // Else, no errors setting the advertisement
return true;
}
BT_setAdvertisementMessage()
包裝gecko_cmd_le_gap_bt5_set_adv_data()
,它在native_gecko.h
中定義,一個 SDK header 文件。 我在Bluetooth_HW.h
中聲明BT_setAdvertisementMessage()
並在bluetooth_HW.c
中定義它。 我需要設置廣告消息的代碼然后包含Bluetooth_HW.h
而不是native_gecko.h
,並且Bluetooth_HW.h
很容易模擬。
我想測試Bluetooth_HW.c
。 我需要為此模擬native_gecko.h
,因為我對運行它的代碼不感興趣(它由制造商提供,我相信它,而且我不是單元測試native_gecko
,我是單元測試Bluetooth_HW
)。 通常,我會在我的測試中包含生產.h
文件,以獲取函數的聲明,然后用我的假實現替換包含生產代碼定義的.c
文件。
我的問題是native_gecko.h
將gecko_cmd_le_gap_bt5_set_adv_data()
定義為 header 內的內聯,而不是在.c
文件上執行此操作的更常見方法。
我可以將native_gecko.h
本身包裝在僅聲明我需要的函數的 header 上,並使我的代碼包含 header,但是我無法訪問在native_gecko.h
中聲明的其他內容,例如自定義類型和枚舉。 我不能將這些類型和枚舉移動到包裝器中,因為我不能從native_gecko.h
中刪除它們,然后編譯器會抱怨被定義了兩次,我不想碰native_gecko.h
,因為它是SDK 文件。
所以,我的問題是如何模擬在其標頭中定義代碼的模塊?
我設法通過提供一個假的native_gecko.h
讓它工作。 然后測試環境指向假的 header 而不是生產環境。 就我而言,由於native_gecko.h
非常龐大,我只是通過手術添加了使其工作所需的最少元素。 我只添加了所需函數的聲明。 雖然我可以模仿真實模塊的行為並將它們添加為內聯函數,但這需要將 CPPUTest 中的 mocking 框架包含到native_gecko.h
中,即 C++。 When the compiler tries to compile Bluetooth_HW.c
as C code and pulls the header, it will complain about the presence of the C++ code. By adding the mocked function definitions to their own file, I could leave the mocking framework code out of the header, and my original, production code, C file would compile with just C code.
粗略地說,步驟是
native_gecko.h
。native_gecko.h
的情況,只需為您的 Code-Under-Test 中使用的函數創建聲明)。創建一個假的 header 並不理想,因為內容可能會隨着 SDK 更新而改變,例如,存在人為錯誤的空間,但這是我能想到的最干凈的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.