我正在使用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*
的{{1}}值都通过?因此测试涵盖了两者的决定。
我正在考虑嘲笑,以便它可以期望调用true和false,但因为它不是类成员中的函数,我想你不能对process_进行模拟?
如果可以,如何模拟变量?
注意:我在linux和gcc上:)谢谢!
答案 0 :(得分:0)
声明A
的子类。由于process_
为protected
,因此在运行测试之前,您可以使用A to set it to
true or
false`的子类。
答案 1 :(得分:0)
protected
属性/方法
无需修改生产代码即使受到保护,您也可以轻松修改_process
,只需执行此操作:
class SubA : public A
{
public:
void setProcess( bool val ) { process_ = val; }
};
A a;
SubA* pA = (SubA*) &a;
pA->setProcess( false );
这将非常有效且安全。即使您将A*
转换为SubA*
并且它不是真正有效,它也会起作用,因为内存中的SubA
个对象与A
个对象相同(如SubA
}没有声明任何额外的属性。)
这只能起作用,因为process_
是protected
,所以你创建一个派生类SubA
并使用它,因为编译器将允许这个子类访问受保护的东西。
protected
甚至private
属性/方法现在,如果process_
为private
,则无效......但private
/ protected
仅由编译器管理...属性为在记忆中你可以访问它们,即使你没有被允许进入"。
它很难看但效果很好:
#define protected public
#define private public
#include "A.h"
#undef private
#undef protected
{
A a;
a._process = false;
}
此黑客可让您轻松访问测试程序中的任何private
/ protected
属性/函数。