【发布时间】: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