我正在使用googletest / googlemock处理C 生产环境 代码 . 在使用A.cpp中的一个函数时,我偶然发现了这个想法:
bool A::process_(false);
bool A::process()
{
if ( !process_ ){
process_ = true;
}
return process_;
}
标头包含的位置:
protected:
static bool process_;
public:
static bool process();
我陷入困境,我只能测试函数的预期输出为true或输入为false,如下所示:
TEST(ATest, processVal){
A a;
EXPECT_TRUE(a.process());
}
有没有办法测试函数,以便传递 *true*
和 *false*
的 process_
值?因此测试涵盖了两者的决定 . 我正在考虑嘲笑,以便它可以期望调用true和false,但因为它不是类成员中的函数,我想你不能嘲笑process_?如果可以,如何模拟变量?
注意:我在linux和gcc :)谢谢!
2 回答
声明
A
的子类 . 由于process_
是protected
,因此在运行测试之前,可以使用A to set it to
trueor
false`的子类 .protected
属性/方法而不修改 生产环境 代码即使受到保护,您也可以轻松修改
_process
,只需执行以下操作:这将很好地工作,是安全的 . 即使你将
A*
转换为SubA*
并且它不是真正有效,它也会起作用,因为内存中的SubA
对象与A
对象相同(因为SubA
没有声明任何额外的属性) .这只能起作用,因为
process_
是protected
,所以你创建一个派生类SubA
并使用它,因为编译器将允许这个子类访问受保护的东西 .protected
and even private 属性/方法而不修改 生产环境 代码现在,如果
process_
是private
,这将无效......但是,private
/protected
仅由编译器管理...属性在内存中,即使您不是"allowed to",也可以访问它们 .这很难看,但完美无缺:
这种破解使您可以轻松地从测试程序中访问任何
private
/protected
属性/函数 .