我正在迈出单元测试的第一步,并且遇到了封装问题。我的类有一些不应该对客户端可见的私有成员变量,但是为了让我将对象置于我想要测试它的状态,我需要设置这些私有变量。
假设我有这样的代码:
Class Foo {
public:
int action() ;
private:
int state ;
} ;
int Foo::action()
{
if(this->state == 1)
return 1 ;
else
return 0 ;
}
所以现在我想测试Foo::action()
,但我需要能够设置Foo::state
能够在不同场景下检查功能。一种解决方案是测试代码中的邪恶“ define private public
”。但是还有什么更优雅的吗?我想强调这Foo::state
是一个不应该被客户端访问的变量,所以我不想声明任何公共设置器。
编辑:
我现在认为扩展我想在测试代码中测试的类并在派生类中包含设置器是可行的,前提是我将私有变量更改为受保护的。但这是一个“仅一代”的解决方案,仍然感觉像是一种黑客行为,而不是一种正确的方法。
编辑2:
在阅读了我得到的答案和评论后(特别感谢 Lieven 和 ap。)我相信我现在尝试测试的实际课程(不是我提供的简单示例)做得太多了,我的问题的答案正在发生变化将它的一些逻辑放到另一个类中,供大佬使用。