我有一个单元测试课Tester; 我希望它访问Working类的私有字段.
class Working {
// ...
private:
int m_variable;
};
class Tester {
void testVariable() {
Working w;
test( w.m_variable );
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下选择:
public- 丑陋test_getVariable()- 过于复杂friend class Tester到工作 - 然后明确地工作"知道"测试器,这是不好的我的理想是
class Working {
// ...
private:
int m_variable;
friend class TestBase;
};
class TestBase {};
class Tester : public TestBase {
void testVariable() {
Working w;
test( w.m_variable );
}
}
Run Code Online (Sandbox Code Playgroud)
Working知道TestBase而不是每个测试......但它不起作用.显然友谊不适用于继承.
这里最优雅的解决方案是什么?
Tro*_*ott 16
通常,您的单元测试不应评估私有变量.将测试写入接口,而不是实现.
如果您确实需要检查私有变量是否具有特定特征,请考虑使用assert()而不是尝试为其编写单元测试.
更长的答案(为C#而不是C++编写,但适用相同的原则)在/sf/answers/76543701/.
Mic*_*fik 15
我同意Trott的回答,但有时您会将单元测试添加到非为其设计的遗留代码中.在那些情况下,我伸手去拿#define private public.它只是在单元测试中,而且只是因为重构过于昂贵而无法理解.这是丑陋的,技术上非法,非常有效.
-fno-access-control如果您只使用 GCC,则可以-fno-access-control在编译单元测试时使用编译器选项。这将导致 GCC 跳过所有访问检查,但仍保持类布局相同。我不知道其他编译器是否有类似的选项,所以这不是一个通用的解决方案。
| 归档时间: |
|
| 查看次数: |
4356 次 |
| 最近记录: |