看起来我不能在模拟接口时使用虚拟继承。我需要使用虚拟继承,因为我的代码依赖于第三方库。第三方库使用虚拟继承通过父对象从一个子项转换到另一个子项。我们需要能够根据第三方库的期望进行模拟,但事实并非如此。
注: 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());发布于 2017-09-07 16:08:50
你只需要一个从ID派生的模拟对象,然后模拟它的所有函数。然后忘记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& c) -您想要测试的代码-只需将mockD传递给以下代码:
codeUnderTest(mockD);如果您出于其他原因同时需要MockD和MockC,则使用模板定义来实现此目标:
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>;https://stackoverflow.com/questions/45873062
复制相似问题