簡體   English   中英

可以模擬具有聲明函數的 header 嗎?

[英]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.hgecko_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.

粗略地說,步驟是

  1. 確保測試項目看不到真實的生產代碼native_gecko.h
  2. 提供它的假版本,用任何已定義的函數替換聲明(如果文件太大,如native_gecko.h的情況,只需為您的 Code-Under-Test 中使用的函數創建聲明)。
  3. 為這些函數提供定義。

創建一個假的 header 並不理想,因為內容可能會隨着 SDK 更新而改變,例如,存在人為錯誤的空間,但這是我能想到的最干凈的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM