如何模拟函数在相同的UUT在C



我正在使用Ceedling学习单元测试,使用CMock进行模拟,在现有的嵌入式C代码库上(我可以调整以适应)。

我遇到过单元内的一个函数调用同一单元内的另一个函数的情况。

int foo_a(int r) 
{
    /* foo_a work */
    /* do not wish to test this function just to test foo_b. */
}
int foo_b(int i) /* function to test */
{
    /* foo_b work */
    if (some_condition)
        foo_a(k); /* need to test if foo_a() is called or not. */
}

我不想测试foo_a()作为foo_b()测试的一部分。我如何模拟foo_a(),以便我仍然可以测试它是否被调用,但不测试foo_a()函数本身?

如果不修改源代码,就无法做到这一点。

考虑将函数拆分为两个独立的编译单元。

或者,在要替换的函数周围添加一个#ifndef TEST

根据我使用ceedling的经验,最好的方法是创建一个自定义的TEST_ASSERT_FOO_A_IS_CALLED();TEST_ASSERT_IS_DOING_WHAT_FOO_A_SHOULD_BE_DOING();(略有不同)在第二种情况下,您正在测试是否正在执行一组操作,而不是您不应该知道的内部函数。

理论上,使用单元测试,你不关心该函数是如何操作的(即,你不关心foo_b()是否调用foo_a(),只要foo_b()对模拟函数做了与foo_a()相同的事情),你不应该能够判断是否调用了内部(私有)函数,如foo_a()。因此,您应该测试是否正在调用模拟函数,而不是内部函数本身。

如何创建自定义ASSERT?这很简单,只需使用普通的C宏来定义它,例如:

#define TEST_ASSERT_FOO_A_IS_CALLED() 
{                                     
  TEST_ASSERT_CALLED(some_mocked_function_foo_a_is_expected_to_call);                              
  TEST_ASSERT_EQUAL_MESSAGE(expected_value, some_mocked_function_foo_a_is_expected_to_call_fake.arg0_val, "Something wrong with arg0!"); 
}

包括"_MESSAGE"assert不是必需的,但是更容易发现宏中的哪个assert失败了,因为宏中的每个"fail"都将显示相同的行号,这使得发现它变得更加困难。

如果由于某种原因它经常发生,这是一个标志,foo_a()应该在另一个可以模拟的源文件

相关内容

  • 没有找到相关文章

最新更新