我开始在某些C嵌入式项目中使用CppUTest。现在我正在处理对系统的模拟调用。在学习如何传递C典型类型之后,在ex:
中正常运作的示例:
模拟文件的一部分代码:
kny.request.airport.fsCode; // This is == "KYA"
测试与此模拟调用相关的代码部分代码:
uint32_t LL_TIM_GetPrescaler(TIM_TypeDef * TIMx){
mock().actualCall("LL_TIM_GetPrescaler");
return mock().unsignedIntReturnValue();
}
理解这一点对我没有任何问题。
但是现在我正在尝试将一个结构从测试传递给一个模拟调用,该模拟调用具有我希望模拟发送到调用函数(所测试的生产代码)的所需字段列表。案例是使用一些系统调用来测试函数。这件事就像:
正在测试的一段代码:
TEST (HAL_AS393,HAL_AS393x_Init_test)
{
...
mock().expectOneCall("LL_TIM_GetPrescaler").andReturnValue(TEST_PRESCALER_VALUE);
//being TEST_PRESCALER_VALUE an int initialized variable before
...
}
现在的想法是 - 我的测试文件中的使用模拟 - :
//struct type definition
typedef struct
{
bool_t WAKE_FLAG;
bool_t DATA_READ_FLAG;
}HAL_AS393X_Status;
//function under test
RFIDDrvStatus RFID_DRV_GetStatus(void)
{
HAL_AS393X_Status HAL_Status;
...
HAL_Status=HAL_AS393x_GetStatus();
...
}
我的问题是,我如何构建这个mock.expectOneCall(“HAL_AS393x_GetStatus”)的mock.actualCall,以便说它必须返回一个已定义的类型结构(HAL_AS393X_Status)? 如果可能的话,或者如果可能的话,我正在为这样的事情提供信息:
TEST(RFID_Drv,RFID_DRV_GetStatus_test )
{
HAL_AS393X_Status FAKE_HAL_STATUS;
FAKE_HAL_STATUS.WAKE_FLAG=TRUE;
FAKE_HAL_STATUS.DATA_READ_FLAG=TRUE;
...
mock().expectOneCall("HAL_AS393x_GetStatus").andReturnValue(FAKE_HAL_STATUS);
...
}
XXX上的模拟语法必须是什么?
答案 0 :(得分:1)
使用Cppumock returnPointerValueOrDefault
,在返回之前投射和取消引用它。
你的模拟函数体可以是这样的:
static HAL_AS393X_Status default;
mock().actualCall("HAL_AS393x_GetData");
return *(HAL_AS393X_Status *)mock().returnPointerValueOrDefault(&default);`
在测试中,你期望这样的模拟:
TEST(RFID_Drv,RFID_DRV_GetStatus_test )
{
HAL_AS393X_Status FAKE_HAL_STATUS;
FAKE_HAL_STATUS.WAKE_FLAG=TRUE;
FAKE_HAL_STATUS.DATA_READ_FLAG=TRUE;
...
mock().expectOneCall("HAL_AS393x_GetStatus").andReturnValue(&FAKE_HAL_STATUS);
...
}