通过在单元测试中定义自己的PRIVATE宏,可以使私有成员公开吗?

时间:2014-12-04 20:24:20

标签: c++ unit-testing

我确实需要测试C ++类的私有成员方法。

由于它是私有方法,我不想将其更改为受保护,因此我无法通过创建子类并使用声明添加它来公开。

因此,如果我定义一个宏来替换private关键字。这是解决这个问题的好方法吗?

#if __UNITTEST__
#define PRIVATE public
#else 
#define PRIVATE private
#endif

class A {
    PRIVATE:
        void f();
};

1 个答案:

答案 0 :(得分:5)

使用宏来改变C ++关键字的含义是一个非常糟糕的主意。它不仅会使您的读者感到困惑,而且还会打开您的代码,以便从代码的善意消费者那里编译时滥用,只需通过定义预处理程序符号就可以使您的类的私有成员对其可见。

单元测试私有成员函数的想法同样有害,因为您的单元测试会破坏您的实现的封装。

应该只对公共成员和受保护成员进行单元测试。另一方面,私有成员应通过调用公共成员和受保护的成员函数来间接测试,让私有成员函数保持其实现细节。

如果您绝对必须测试私有函数(我强烈建议您反对),您可以将您的单元测试类声明为正在测试的类的friend,授予其成员函数访问所需的私有成员函数类。