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

Con*_* Ma 4 c++ unit-testing

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

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

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

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

class A {
    PRIVATE:
        void f();
};
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

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

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

一个人应该只测试公共和受保护成员.另一方面,私有成员应通过调用公共成员和受保护的成员函数间接测试,让私有成员函数保持其实现细节.

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