unit testing一个variables为true和false

我在这里用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(); 

我陷入了一种方式,我只能testing函数的预期的输出为true或input为false,如下所示:

 TEST(ATest, processVal){ A a; EXPECT_TRUE(a.process()); } 

有没有一种方法来testing函数,使得process_ *true**false*值都被传递了? 这样testing涵盖了两者的决定。 我正在考虑嘲笑,所以它可以期待一个既是真实又是假的调用,但是因为它不是一个类的成员中的函数,所以我猜你不能嘲笑process_? 如果可以,如何模拟variables?

注意:我在linux和gcc上:)谢谢!

Solutions Collecting From Web of "unit testing一个variables为true和false"

  • 解决方案1:从测试中访问任何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并使用它,因为编译器将允许这个子类访问受保护的东西。

  • 解决方案2:从测试中访问任何protected 甚至是private属性/方法,而无需修改生产代码

现在,如果process_private ,这是行不通的……但是, private / protected只能由编译器来管理……这些属性在内存中,即使你不被允许也可以访问它们。

这是丑陋的,但完美的作品:

 #define protected public #define private public #include "Ah" #undef private #undef protected { A a; a._process = false; } 

这个黑客技术可以很容易地从你的测试程序中访问任何private / protected属性/功能。

声明A的子类。 由于process_protected ,因此可以在运行测试之前使用A to set it to的子类A to set it to true or false。