如何在没有实现的情况下测试纯虚拟类

How to test a pure-virtual class without implementation?

本文关键字:测试 情况下 虚拟 实现      更新时间:2023-10-16

我有以下类:

// IVirtualController.hpp
class IVirtualController
{
public:
  virtual InputCode validate(int keycode) = 0;
  virtual ~IVirtualController();
};

现在我想嘲笑这个类:

// InputManagerTest.cpp
class MockController : public IVirtualController
{
public:
  MOCK_METHOD1(validate,InputCode(int keycode));
};

但这行不通!我得到以下错误:

test/input/InputManagerTest.o:在函数MockController::~MockController()': test/input/InputManagerTest.cpp:19: undefined reference to IVirtualController::~ IVirtualController((中'test/input/InputManagerTest.cpp:19:对`IVirtualController::~IVirtualController(('的未定义引用

test/input/InputManagerTest.o:IVirtualController’的函数IVirtualController::IVirtualController()': test/input/../../src/input/IVirtualController.hpp:14: undefined reference to vtable

test/input/InputManagerTest.o:在函数MockController::MockController()': test/input/InputManagerTest.cpp:15: undefined reference to IVirtualController::~ IVirtualController(('中

test/input/InputManagerTest.o:(.rodata._ZTI14MockController[_ZTI14MockController]+0x10(:对"IVirtualController的类型信息"的未定义引用

搜索告诉我,"对vtable/typeinfo的未定义引用"错误是由缺少实现、虚拟方法声明后面缺少"=0"或非虚拟析构函数引起的。类IVirtualController没有实现,但这应该不是问题,因为MockController正在实现它,对吧?注释掉整个InputManagerTest.cpp模拟文件"解决"了这个问题,即使IVirtualController在另一个类中使用。

我该如何测试它?

没有。析构函数必须始终实现。即使是纯虚拟的。

这是因为它的工作方式。应用于析构函数的virtual使

具有不同的更多含义。通常,如果virtual方法在派生类中被重写,则不会调用该方法,但仍将调用virtual析构函数,因此需要实现。

析构函数的=0只使类抽象,但如前所述,仍然需要实现。

相关文章: