单元测试true和false的变量

时间:2016-05-20 12:25:17

标签: c++ linux unit-testing googletest

我正在使用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上:)谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  • 解决方案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 "A.h"
#undef private
#undef protected

{
    A a;
    a._process = false;
}

此黑客可让您轻松访问测试程序中的任何private / protected属性/函数。