我确实需要测试C ++类的私有成员方法。
由于它是私有方法,我不想将其更改为受保护,因此我无法通过创建子类并使用声明添加它来公开。
因此,如果我定义一个宏来替换private关键字。这是解决这个问题的好方法吗?
#if __UNITTEST__
#define PRIVATE public
#else
#define PRIVATE private
#endif
class A {
PRIVATE:
void f();
};
答案 0 :(得分:5)
使用宏来改变C ++关键字的含义是一个非常糟糕的主意。它不仅会使您的读者感到困惑,而且还会打开您的代码,以便从代码的善意消费者那里编译时滥用,只需通过定义预处理程序符号就可以使您的类的私有成员对其可见。
单元测试私有成员函数的想法同样有害,因为您的单元测试会破坏您的实现的封装。
应该只对公共成员和受保护成员进行单元测试。另一方面,私有成员应通过调用公共成员和受保护的成员函数来间接测试,让私有成员函数保持其实现细节。
如果您绝对必须测试私有函数(我强烈建议您反对),您可以将您的单元测试类声明为正在测试的类的friend
,授予其成员函数访问所需的私有成员函数类。