首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >googlemock框架不支持虚拟继承

googlemock框架不支持虚拟继承
EN

Stack Overflow用户
提问于 2017-08-25 09:20:31
回答 1查看 406关注 0票数 1

看起来我不能在模拟接口时使用虚拟继承。我需要使用虚拟继承,因为我的代码依赖于第三方库。第三方库使用虚拟继承通过父对象从一个子项转换到另一个子项。我们需要能够根据第三方库的期望进行模拟,但事实并非如此。

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

代码语言:javascript
运行
复制
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());

};
代码语言:javascript
运行
复制
//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

要测试的代码

代码语言:javascript
运行
复制
ID* pD = dynamic_cast<ID*>(pC);
pD->type();
pC->getValue();

//在测试中

代码语言:javascript
运行
复制
MockC* mockC = new MockC();
EXPECT_CALL(mockC, type());
EXPECT_CALL(mockC, getValue());
EN

回答 1

Stack Overflow用户

发布于 2017-09-07 16:08:50

你只需要一个从ID派生的模拟对象,然后模拟它的所有函数。然后忘记MockC,只需以您需要的方式定义MockD

代码语言:javascript
运行
复制
class MockD : public ID 
{
public:
    MOCK_METHOD0(type, void());
    MOCK_METHOD0(getValue, int());
}; 

这样设置你的测试期望值:

代码语言:javascript
运行
复制
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& c) -您想要测试的代码-只需将mockD传递给以下代码:

代码语言:javascript
运行
复制
codeUnderTest(mockD);

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

代码语言:javascript
运行
复制
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>;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45873062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档