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