【问题标题】:How to mock a template class with gmock(Google Mock)?如何使用 gmock(Google Mock)模拟模板类?
【发布时间】:2020-06-12 08:10:16
【问题描述】:

我有一个类模板如下:

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 ) );
};

我的问题:有没有一种方法可以用单个模拟来模拟类模板?

谢谢!

【问题讨论】:

    标签: c++ unit-testing templates mocking googlemock


    【解决方案1】:

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

    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();
    }
    

    提交时 dcc92d0ab6c4ce022162a23566d44f673251eee4(2020 年 4 月),已超过 latest release。作为 afkid,我想知道您是否使用的是最新版本的 gmock

    【讨论】:

    • 非常感谢,但我必须接受afkid的回答,因为他的回答比较早。
    【解决方案2】:

    看看cook_book https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md,你实际上可以做到。检查您是否使用最新版本可能会很有趣。

    【讨论】:

    • 感谢您的帮助。我阅读了您提供的烹饪书,但我认为该 URL 中的方式与我的相同,即“分别模拟它们”,而不是“用单个模板模拟它们”。我说的对吗?
    • 我认为您也可以使用一个模板来完成。您可以查看Mocking Class Templates 部分中的示例,但我想您需要检查他们添加此功能的版本,或者可能在专用文件夹中进行事先测试以确保一切正常。不幸的是,只要我没有正确的编译错误,我就很难评估您的问题。我假设他们在存储库中没有关于此问题的任何特殊问题,因此没有错误。
    • 是的,你是对的。我试过了,它有效。再次感谢您!
    猜你喜欢
    • 2022-08-10
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多