gpt4 book ai didi

c++ - 单元测试变量的真假

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:39 24 4
gpt4 key购买 nike

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

}

有没有一种方法可以测试函数,以便同时传递 process_*true**false* 值?这样测试就涵盖了两者的决定。我在考虑模拟,以便它可以预期对 true 和 false 的调用,但因为它不是类成员中的函数,我想你不能对 process_ 进行模拟?如果可以,如何模拟变量?

注意:我使用的是 linux 和 gcc :) 谢谢!

最佳答案

  • 解决方案 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 并使用它,因为编译器将允许这个子类访问 protected 东西。

  • 解决方案 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;
}

这个 hack 可以很容易地从您的测试程序访问任何private/protected 属性/函数。

关于c++ - 单元测试变量的真假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37346690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com