C++ 如何用gmock(googlemock)模拟模板类?

C++ 如何用gmock(googlemock)模拟模板类?,c++,unit-testing,templates,mocking,googlemock,C++,Unit Testing,Templates,Mocking,Googlemock,我有一个类模板,如下所示: struct DailyQuote_t; struct TickQuote_t; template <typename Q> class QtBuffer_t { public: virtual int size() const noexcept = 0; }; 在测试另一个名为OrderBook_t的类时,实例QtBuffer_t和QtBuffer_t都是必需的 class OrderBook_t { public: void setDe

我有一个类模板,如下所示:

struct DailyQuote_t;
struct TickQuote_t;

template <typename Q>
class QtBuffer_t {
public:
   virtual int size() const noexcept = 0;
};
在测试另一个名为OrderBook_t的类时,实例QtBuffer_t和QtBuffer_t都是必需的

class OrderBook_t {
public:
   void setDependent( const QtBuffer_t<DailyQuote_t>* pDB, const QtBuffer_t<TickQuote_t>* pTB ) noexcept {
      m_pDBuf = pDB;
      m_pTBuf = pTB;
   };

   bool update() {
      m_pDBuf->size();
      m_pTBuf->size();
   };

private:
   const QtBuffer_t<DailyQuote_t>* m_pDBuf;
   const QtBuffer_t<TickQuote_t>*  m_pTBuf;
};
我尝试如下模拟模板,但失败了:

template<typename Q>
class QtBufferMock : public QtBuffer_t<Q> {
public:
   MOCK_METHOD( int, size, (), ( const, noexcept, override ) );
};
最后我不得不分别嘲笑他们

class DailyBufferMock : public QtBuffer_t<DailyQuote_t> {
public:
   MOCK_METHOD( int, size, (), ( const, noexcept, override ) );
};

class TickBufferMock : public QtBuffer_t<TickQuote_t> {
public:
   MOCK_METHOD( int, size, (), ( const, noexcept, override ) );
};
我的问题是:有没有一种方法可以用一个mock来模拟类模板


谢谢

通过看烹饪书,你实际上可以做到这一点。检查您是否使用了最新版本可能会很有趣。

在示例测试中逐字运行代码对我很有用:

template<typename Q>
class QtBufferMock : public QtBuffer_t<Q> {
public:
   MOCK_METHOD( int, size, (), ( const, noexcept, override ) );
};


TEST(T1, CreateMockObj){
    QtBufferMock<DailyQuote_t> m1;
    QtBufferMock<TickQuote_t> m2;
    OrderBook_t t;
    t.setDependent(&m1,&m2); 
    t.update();
}

于2020年4月4日提交DCC92D0AB6C4CE022162A235566D44F673251EE4,该日期已过。作为一个孩子,我想知道你是否使用了最新版本的gmock?

谢谢你的帮助。我读了你提供的烹饪书,但我认为URL的方式与我的相同,即分别模拟它们,而不是用单个模板模拟它们。我说的对吗?我想你也可以用一个模板来完成。您可以查看Mocking类模板部分中的示例,但我想您需要检查他们添加此功能的版本,或者在专用文件夹中进行预先测试,以确保一切正常。不幸的是,只要我没有正确的编译错误,我就很难评估您的问题。我假设他们在存储库中没有关于这个问题的任何特殊问题,所以没有bug。是的,你是对的。我试过了,很管用。再次感谢你!非常感谢,但我必须接受一个孩子的回答,因为他的回答更早。