2016-11-08 52 views
0

我正在学习使用Ceedling和CMock for Mock在现有嵌入式C代码库(我可以调整以适合它)上进行单元测试。如何在同一UUT中模拟函数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()函数本身?

+0

我对C的了解不多,但如果它与许多其他语言一样,可以将方法标记为虚拟/可覆盖。在这样的情况下,你可以提供一个模拟/伪造的已知/设置的返回'foo_a'。这样,当使用模拟/伪造类时,当你调用'foo_b'时,你会碰到你的模拟/重写的'foo_a'方法,而不是真正的impl,所以你可以专注于测试'foo_b'而不用担心'foo_a 'impl。 – Kritner

+1

@ kritner C不是面向对象的。它没有诸如虚拟,可重写,继承或多态等概念。 – Toby

回答

0

如果不修改源代码,则无法执行此操作。

考虑将功能分解为两个单独的编译单元。

或者,围绕要替换的功能添加一个#ifndef TEST

+0

这可以让我介绍一个假的,但是我怎样才能确定这个假货是否被叫?首先想到的是简单地引入一个全局标志,如果调用了伪造,那么将会设置全局标志,然后在我的测试中检查标志。有没有更好的方法或更多的推荐做法? – Toby