【发布时间】:2016-02-28 12:22:26
【问题描述】:
在开发单元测试时,可能需要访问私有成员来检查类的内部状态。有时 getter 和 setter 函数不可用,有时它们不公开。
第一个处理这个问题的方法是,编写一个预处理器定义写入 publis 而不是 private 和 protected。
#define protected public
#define private public
第二种方法是让测试类成为类的朋友。
class test_foo {
};
class foo {
private:
int mem;
friend class test_foo;
};
第三种方法是为测试创建公共接口。
class foo {
#if defined FOO_UNIT_TEST
public:
int get_mem() const;
#endif
private:
int mem;
};
除了这些方法还有其他方法吗?每种方法都有优点和缺点。哪一个可以被认为是最佳实践?
谢谢。
【问题讨论】:
-
我只想添加
friend class Unit_test,比如。 不要使用#define。如果包含任何标准库头文件,则为未定义行为。 -
你为什么需要那个?如果无法通过类型的公共或受保护接口检测到错误,则没关系。如果您在类的私有部分有复杂的功能,您可以考虑将其分解为独立的、可测试的组件。
-
单元测试验证类合同的合规性(或 API,如果您愿意),而不是内部实现。您的单元测试类永远不必切换私有成员/方法,这超出了他们的范围。
-
不测试实现;测试合同。如果您分解您的代码,请通过他们的合约递归地对分解后的单元进行单元测试。
-
“在开发单元测试时,可能需要访问私有成员来检查类的内部状态。” - 不,不能。像这样使用“单元测试”意味着白白破坏你的软件架构。
标签: c++ unit-testing