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

标签 c++ googlemock

我有以下类(class):

// 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: In function MockController::~MockController()': test/input/InputManagerTest.cpp:19: undefined reference toIVirtualController::~IVirtualController()' test/input/InputManagerTest.cpp:19: undefined reference to `IVirtualController::~IVirtualController()'

test/input/InputManagerTest.o: In function IVirtualController::IVirtualController()': test/input/../../src/input/IVirtualController.hpp:14: undefined reference tovtable for IVirtualController'

test/input/InputManagerTest.o: In function MockController::MockController()': test/input/InputManagerTest.cpp:15: undefined reference toIVirtualController::~IVirtualController()'

test/input/InputManagerTest.o:(.rodata._ZTI14MockController[_ZTI14MockController]+0x10): undefined reference to `typeinfo for IVirtualController'

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

我如何测试它?

最佳答案

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

那是因为它的工作原理。应用于析构函数的virtual 具有不同 的更多含义。通常,如果 virtual 方法在派生类中被重写,则不会调用它,但仍会调用 virtual 析构函数,因此需要实现。

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

关于c++ - 如何在没有实现的情况下测试纯虚拟类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15842961/

相关文章:

c++ - 使用 GMock 的具有命名空间的模拟方法

c++ - 您可以在迭代时更改 std::list 吗?

c++ - 将 C++ 代码编译为静态库 (.a)

c++ - gmock 支持右值引用的解决方法

c++ - 不同cpp文件中同一个命名空间的两个同名对象

c++ - 如何验证是否使用相同的引用调用了 2 个模拟方法?

c++ - Googlemock 没有捕捉到泄露的对象

c++ - 应用基于不同掩码的位掩码

c++ - UDP 套接字错误 10049

java - 在 JNI 上调用 AttachCurrentThread 是否很容易?