我的项目包含C文件。在某些文件中,我将函数定义为static。
我在单元测试中使用CppUnit,我想测试这些静态函数。我知道不允许从文件外部(它定义的地方)调用函数。有没有一个解决方案来避免这个问题,以便从我的C ++测试文件中调用这些静态函数?
答案 0 :(得分:6)
假设我们正在谈论C静态函数,那么最简单的解决方案是在编译调试版本时使函数非静态。这意味着符号可供您在单元测试中使用。这只适用于没有符号别名的情况。
如果在所有调试版本上定义符号DEBUG
,则类似:
#ifdef DEBUG
#define debug_export
#else
#define debug_export static
#endif
然后定义像这样的静态函数
debug_export void foo(void)
{
...
}
并在头文件中有条件地包含声明,或者在单元测试文件中手动导入它们:
extern void foo(void);
围绕它的其他方法是在源文件本身中包含单元测试(如果它失控,有点乱),不要打扰单元测试功能(一点点警察)或者标记函数as dll-local而不是静态,并确保您的单元测试是该动态对象的一部分。
答案 1 :(得分:4)
我有一个公共头文件,我包含在项目的所有源文件中。我添加了这些行,问题解决了:
#ifdef TEST
#define static
#endif
我甚至可以避免在我的原始C代码中添加上述代码。我可以在gcc命令中添加标志-Dstatic=
,我发现它也可以。
但是在使用此解决方案时我们必须小心,因为:
答案 2 :(得分:1)
有没有办法重构代码以消除对静态方法的需求?从OO设计的角度来看,静力学是羊皮的全球化。
我知道这不一定是实用或最快的答案,但你会通过消除它来改进你的设计。