是否可以通过在单元测试中定义我自己的 PRIVATE 宏来使私有成员公开

Is it OK to make private member public by defining my own PRIVATE macro in unit test?

本文关键字:成员 PRIVATE 单元测试 可以通过 定义 自己的 我自己 是否      更新时间:2023-10-16

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

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

因此,如果我定义一个宏 PRIVATE 来替换私钥。这是解决这个问题的好方法吗?

#if __UNITTEST__
#define PRIVATE public
#else 
#define PRIVATE private
#endif
class A {
    PRIVATE:
        void f();
};

使用宏来更改C++关键字的含义是一个非常糟糕的主意。它不仅会让你的读者感到困惑,而且还会使你的代码受到来自善意的代码消费者的编译时滥用,他们可以通过定义预处理器符号来使类的私人成员对他们可见。

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

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

如果你绝对必须测试私有函数(我强烈建议不要这样做(,你可以将你的单元测试类声明为正在测试的类的friend,授予其成员函数访问所需类的私有成员函数的权限。