CppUtest:如何从mocked函数返回自定义结构

时间:2016-12-21 09:58:38

标签: unit-testing mocking embedded cpputest

我开始在某些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上的模拟语法必须是什么?

1 个答案:

答案 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);
    ...
}