GoogleMock让我在mock类中实现析构函数吗

Does GoogleMock make me implement destructor in mock class?

本文关键字:实现 析构函数 mock GoogleMock      更新时间:2023-10-16

我在运行make:时不断收到这些错误

debug/main.o: In function `MockMQAdapter<SomeClass>::MockMQAdapter()':
/source/Tests/testsfoo/MockMQAdapter.h:30: undefined reference to `MQAdapter<SomeClass>::~MQAdapter()'
debug/main.o:(.rodata._ZTVN2TW9MQAdapterI6ThingyEE[_ZTVN2TW9MQAdapterI6ThingyEE]+0x10): undefined reference to MQAdapter<SomeClass>::~MQAdapter()'
debug/main.o:(.rodata._ZTVN2TW9MQAdapterI6ThingyEE[_ZTVN2TW9MQAdapterI6ThingyEE]+0x18): undefined reference to `MQAdapter<SomeClass>::~MQAdapter()'
debug/main.o:(.rodata._ZTVN2TW9MQAdapterI6ThingyEE[_ZTVN2TW9MQAdapterI6ThingyEE]+0x20): undefined reference to `MQAdapter<SomeClass>::publish(std::string const&, std::string &message)'

这是我的代码:

#include <gmock/gmock.h>
template<typename S>
class MQAdapter {
public:
    MQAdapter(const std::string host, uint16_t port);
    virtual ~MQAdapter();
    virtual void publish(const std::string queue, std::string message);
};
MQAdapter::MQAdapter(const std::string host, uint16_t port) {}
//Generated by gmock_gen.py
template <typename T0>
class MockMQAdapter : public MQAdapter<T0> {
 public:
  MOCK_METHOD2_T(publish,
      void(std::string, std::string));
};

我非常关注谷歌模拟指南。我不明白这些错误是什么意思。以下是我的测试:

TEST(MyTest, ExpectCall) {
  MockMQAdapter<SomeClass> *adapter = new MockMQAdapter<SomeClass>("host", 1);
  EXPECT_CALL(*adapter, publish("hi", "hello"));
  adapter->publish("hi", "hello");
}

您已经声明了MQAdapter析构函数,但没有定义它。因此,链接器在尝试解决它时会抱怨。提供一个定义,default就足够了,即virtual ~MQAdapter() = default;

另一方面,构造函数的定义应该是内联的,或者使用模板参数限定:

template <typename S>
MQAdapter<S>::MQAdapter(const std::string host, uint16_t port) {}

我想这是因为这只是一个例子,但您没有将MQAdapter模板参数用于任何事情,所以它可能是一个常规类。