3

我开始将 CppUTest 用于一些 C 嵌入式项目。现在我正在处理对系统的模拟调用。在学习了如何传递 C 典型类型之后,例如:

正常工作的示例:

模拟文件部分代码:

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

现在的想法是 -在我使用模拟的测试文件中- :

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

我的问题是,我如何构建这个 mock.expectOneCall("HAL_AS393x_GetStatus") 的 mock.actualCall 才能说它必须返回一个定义的类型结构(HAL_AS393X_Status)?如果可能或如果存在,我正在搜索信息以执行此类操作:

mock().actualCall("HAL_AS393x_GetData");
return mock().XXXReturnValue();`

什么模拟语法必须在 XXX 地方?

4

1 回答 1

2

使用 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);
    ...
}
于 2016-12-21T12:51:38.070 回答