首页 文章

单元测试true和false的变量

提问于
浏览
1

我正在使用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 回答

  • 0

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

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

    • Solution2: 从测试中访问任何 protected and even private 属性/方法而不修改 生产环境 代码

    现在,如果 process_private ,这将无效......但是, private / protected 仅由编译器管理...属性在内存中,即使您不是"allowed to",也可以访问它们 .

    这很难看,但完美无缺:

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

    这种破解使您可以轻松地从测试程序中访问任何 private / protected 属性/函数 .

相关问题