我正在从事一个针对 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()
wraps gecko_cmd_le_gap_bt5_set_adv_data()
,在native_gecko.h
SDK 头文件中定义。我BT_setAdvertisementMessage()
在中声明Bluetooth_HW.h
并定义它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()
为标题内的内联,而不是在文件上执行它的更常见方法.c
。
我可以将自己包装native_gecko.h
在一个只声明我需要的函数的标头上,并使我的代码包含该标头,但是我无法访问在 中声明的其他内容native_gecko.h
,例如自定义类型和枚举。我无法将这些类型和枚举移动到包装器中,因为我无法从中删除它们,native_gecko.h
然后编译器会抱怨被定义了两次,我不想 touch native_gecko.h
,因为它是一个 SDK 文件。
所以,我的问题是如何模拟在其标头中定义代码的模块?