为测试目的覆盖非虚函数
Override non-virtual function for testing purpose
我有一个需要模拟的类,但该类具有需要模拟的非虚拟方法。下面是我的问题的一个简单版本:
#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"函数,但我希望它以某种方式调用派生类的。真正的问题是,我已经创建了一个新的类,其唯一的公共方法做一些逻辑,也需要从数据库的序列。从数据库中获取序列的类(称为DlSequence)是我们应用程序(您可以调用的核心或产品)的基础代码,我无法更改它。现在我需要使用cppunit测试我的类。因此,我必须模拟或伪造DlSequence类并覆盖getNext函数,但此函数不是虚拟的。有可能嘲笑它吗?或者我可以绕过这个问题与任何变通。我没有使用任何mock框架,但我在我的盒子里安装了mockpp,我不能安装任何其他mock框架。
简短的回答:没有。
如果类的作者没有提供自定义行为的方法,那么它就是不可能的。
如果你不能自己改变它,向他们提出你需要一个钩子的问题。
长答案:
就c++而言,可能有办法尝试破解它,但它既不安全又脆弱。我可以想到在基类中注入一个基于预处理器的关键字virtual
,甚至使用LD_PRELOAD来覆盖函数符号……但老实说,两者都不吸引人。
注意:如果我们谈论的是测试你的代码,你可以改变你的代码,那么当然你可以在这个Base
的东西周围创建一个包装器,使它成为virtual
/template
/什么;
当你在测试驱动需要与外部资源(例如,第三方库,I/O等)交互的代码时,你通常会引入一个接缝,在那里你可以模拟出依赖。
这也适用于你的情况。如果您无法修改合作者的代码,那么它与第三方库(从这个意义上说)并没有太大的不同。与其试图直接嘲笑合作者,不如找出你的代码和有问题的代码之间的接缝。
例如: #include <iostream>
#include <string>
using namespace std;
class Base{
public:
void getNext(){
cout << "Base Func" << endl;
}
};
class Seam{
public:
virtual ~Seam() { }
virtual void getNext() = 0;
};
class MockCollaborator : public Seam{
public:
void getNext(){
cout << "Derived func" << endl;
}
};
class RealCollaborator : public Seam{
public:
void getNext(){
Base base;
base.getNext();
}
};
int main(){
Seam* ptr = new MockCollaborator();
ptr->getNext();
}
如果你可以制作你的类模板,你可以使用下面的东西:
class Base {
public:
void getNext() { cout << "Base Func" << endl; }
};
// Has the same interface of Base
class MockedBase {
public:
void getNext() { cout << "Derived func" << endl; }
};
在课堂上,像这样做:
template <typename T> class myClass
{
public:
void callGetNext() { base.getNext(); }
private:
T base;
};
因此在实际代码中使用myClass<Base>
,在unittest中使用myClass<MockedBase>
。
相关文章:
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 如何使用用户定义的函数覆盖 C lib 函数,如 _sbrk?
- 函数覆盖有哪些用例?
- 在子类函数覆盖中省略具有默认值的参数
- C++ 成员变量被非成员函数覆盖
- 用现有函数覆盖虚拟函数
- 函数覆盖是否由编译器自动完成
- 结构被库函数覆盖
- 当在Python中定义__str__时,如何将C 的标准全局函数覆盖
- C++类是否解决函数覆盖问题
- 用私有基函数覆盖公共虚拟函数
- 优先级队列中复制构造函数覆盖的值
- 虚拟函数覆盖预期错误
- C++中的函数覆盖无需"虚拟"即可工作
- C++虚拟函数覆盖
- 如何用非虚拟函数覆盖虚拟函数
- 基成员函数的所有重载是否可以被单个模板化成员函数覆盖和转发到
- C++继承函数覆盖
- 纯虚函数覆盖虚函数
- 引用项目的Qt-main()函数覆盖实际项目的main()