【问题标题】:How do I pass a double value to my C mock function with cmocka will_return()?如何使用 cmocka will_return() 将双精度值传递给我的 C 模拟函数?
【发布时间】: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


【解决方案1】:

预期的方法是使用will_return_floatmock_float

还有其他“分配”宏:

  • will_return_int mock_int
  • will_return_float mock_float
  • will_return_ptr mock_ptr

使用而不是“铸造”宏will_returnmock_type

旁注:mock_float 不接受宏参数,截至目前,它们将值存储为 double

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多