gpt4 book ai didi

c++ - 出于测试目的覆盖非虚函数

转载 作者:行者123 更新时间:2023-11-30 02:46:00 25 4
gpt4 key购买 nike

我有一个需要模拟的类,但该类有需要模拟的非虚拟方法。下面演示了我的问题的一个简单版本:

#include <iostream>
#include <string>

using namespace std;

class Base{
public:
void getNext(){
cout<<"Base Func"<<endl;
}
};

class Derived: public Base{
public:
void getNext(){
cout<<"Derived func"<<endl;
}
};

int main(){
Base *ptr = new Derived();
ptr->getNext();
}

上面的代码将调用基类的“getNext”函数,但我希望它以某种方式调用派生类的函数。真正的问题是我创建了一个新类,它的唯一公共(public)方法执行一些逻辑并且还需要来自数据库的序列。从数据库中获取序列的类(称为 DlSequence)是我们应用程序(您可能称之为核心或产品)的基本代码,我无法更改它。现在我需要使用 cppunit 测试我的类(class)。因此,我必须模拟或伪造 DlSequence 类并覆盖 getNext 函数,但此函数不是虚拟的。有可能 mock 它吗?或者我可以通过任何解决方法绕过这个问题。我没有使用任何模拟框架,但我的盒子里安装了 mockpp,我无法安装任何其他模拟框架。提前致谢。

最佳答案

简短的回答:

如果类的作者没有提供自定义行为的方法,那么这是不可能的。

如果您自己无法更改,请向他们提出您需要钩子(Hook)的问题。


长答案:

就 C++ 而言,可能有一些方法可以尝试和破解它,但它既不安全又脆弱。在我的脑海中,我想到了基于预处理器 hackery 在基类中注入(inject)一个 virtual 关键字,甚至使用 LD_PRELOAD 来覆盖函数符号......但老实说,这两者都没有吸引力。

注意:如果我们正在谈论测试您的代码,并且您可以更改您的代码,那么您当然可以围绕这个 Base 事物创建一个包装器并使其成为 virtual /模板/随便;我想在这里你不能。

然而,就 SQL 而言,您可能有机会,例如,通过将 API 调用或什至网络调用重定向到您控制下的模拟或数据库实例。不知道您的系统的具体情况,但是我无法提供任何进一步的建议。

关于c++ - 出于测试目的覆盖非虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23957051/

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