【问题标题】:googlemock framework doesn't work with virtual inheritancegooglemock 框架不适用于虚拟继承
【发布时间】:2017-08-25 01:20:31
【问题描述】:

在尝试模拟接口时,我似乎无法使用虚拟继承。我需要使用虚拟继承,因为我的代码依赖于第三方库。第 3 方库使用虚拟继承通过父级从一个子级转换为另一个子级。我们需要能够按照 3rd 方库的期望进行 mock,但事实并非如此。

注意:IA、IB、IC 和 ID 是第三方库

class IA
{
};

class IB :virtual public IA
{
};

class IC :virtual public IB
{
public:
    int getValue(){}
};

class ID : virtual public IA
{ 
public:
    void type(){};
};

class MockD :
              public ID 
    //virtual public ID; fails all of my tests that depends on ID
{
public:
    MOCK_METHOD0(type, void())
}; 

class MockC :
    //virtual public IC, virtual public MockD{}; //throws an exception for accessing pD->type()
    //        public IC, virtual public MockD{}; //throws an exception for accessing pD->type()
    //virtual public IC,         public MockD{}; //throws an exception for accessing pC->getValue()
    //        public IC,         public MockD{}; //throws an exception for accessing pD->type() 
{
    MOCK_METHOD0(getValue, void());

};
//throws an exception for accessing pD->type()


           IA
        _______
    (v)/       \(v)
      IB        ID
   (v)|         |
     IC       MockD
      |         |
    (v)\        /(v)   
         MockC


           IA
        _______
    (v)/       \(v)
      IB        ID
   (v)|         |
     IC       MockD
      |         |
      \        /(v)   
         MockC           


           IA
        _______
    (v)/       \(v)
      IB        ID
   (v)|         |
     IC       MockD
      |         |
      \        /   
         MockC           

//throws an exception for accessing pC->getValue()

           IA
        _______
    (v)/       \(v)
      IB        ID
   (v)|         |
     IC       MockD
      |         |
   (v)\        /   
         MockC           
           IA

要测试的代码

ID* pD = dynamic_cast<ID*>(pC);
pD->type();
pC->getValue();

//在测试中

MockC* mockC = new MockC();
EXPECT_CALL(mockC, type());
EXPECT_CALL(mockC, getValue());

【问题讨论】:

  • 用作虚拟基类的接口类通常是多态的

标签: c++ multiple-inheritance googletest virtual-inheritance gmock


【解决方案1】:

您只需要从 ID 派生的 Mock 对象并模拟其所有功能。然后忘记MockC,只需以您需要的方式定义MockD

class MockD : public ID 
{
public:
    MOCK_METHOD0(type, void());
    MOCK_METHOD0(getValue, int());
}; 

并以这种方式设置您的测试期望:

MockD mockD;
EXPECT_CALL(mockD, type());
EXPECT_CALL(mockD, getValue()).WillOnce(Return(0)); //not sure you want zero - use return value that you needs

然后 - 假设这是 void codeUnderTest(IC&amp; c) - 您要测试的代码 - 只需将 mockD 传递给此代码:

codeUnderTest(mockD);

如果您出于其他原因同时需要 MockDMockC - 然后使用模板定义来实现此目标:

template <typename Interface>
class MockCT : public Interface
{
public:
    MOCK_METHOD0(getValue, int());
};
using MockC = MockCT<IC>;

template <typename Interface>
class MockDT : public MockCT<Interface>
{
public:
    MOCK_METHOD0(type, void());
};
using MockD = MockDT<ID>;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 2013-08-24
    • 2013-12-18
    • 2016-03-26
    • 2011-01-08
    相关资源
    最近更新 更多