【发布时间】:2023-02-01 02:38:28
【问题描述】:
我正在使用 mocka 对 C 项目进行单元测试。
我想模拟对在我的被测 C 函数中进行的另一个模块的调用。另一个模块中的这个函数处理双精度数,而不是整数。 will_return 文档说它传递整数值,我可以看到,如果我调用 will_return(__wrap_other_func, 42.99),那么传递到 __wrap_other_func 并通过 double value = mock_type(double) 取出的值将是 42.0,而不是所需的 42.99。
double __wrap_other_func(double param) {
check_expected(param);
double value = mock_type(double); // will_return() has converted this, effectively rounding
fprintf(stderr, "%lf\n", value);
return value;
}
static void test_this_func(void **state) {
(void) state;
expect_value(__wrap_other_func, param, 1.0);
will_return(__wrap_other_func, 42.99);
int result = this_func(12.34); // this_func() will call other_func()
...
assert(result == 0);
/* the assert is failing because the double 42.99 is converted to an integer,
then back to a double, rounding off all the decimal places. */
}
> 42.0
有没有人想出如何使用 will_return 或其他一些 cmocka 方法将双打传递给模拟函数?我坚持这个。
我期望能够使用 cmocka 将非整数值传递给我的模拟函数。
当我尝试使用 will_return() 时,我发现所有双精度值都被四舍五入为整数等价物。
我仔细阅读了 cmocka 文档并在线搜索了 cmocka 示例。
【问题讨论】:
-
关于 cmocka 或任何其他 c 单元测试库,我不是专家,但我认为 cmocka 有充分的理由不允许将
double传递给will_return,因为比较双打并不是真正的好主意,因为精确。如何更改函数以返回一个整数而不是代表某物的一小部分?这就是它在浮点运算成本高昂的嵌入式系统中通常的工作方式。您仍然可以通过在两者之间进行简单的转换来公开double函数。 -
谢谢你的评论,马可!在这种情况下,包装函数对双精度执行计算,因此更改其类型和签名以进行模拟似乎不正确。可以在测试代码中管理双打的精度。
-
Marco 如何建议,在调用
will_return()之前将值转换为 int(保持相同的字节大小),然后在您的函数中将其转换回其原始类型。
标签: c unit-testing mocking cmocka