我正在尝试模拟数据库接口调用,并使用SetArgReferee
将多态数据类型作为引用返回。我正在模拟的方法需要2个基类引用参数。在SetArgReferee
中设置第二个参考参数的值时,会使用派生类对象作为值。在测试的源代码中,返回的第二个引用参数再次强制转换为派生类并使用。这似乎无法正常工作。
我有DBInterface
我正在嘲笑如下。
class DBInterface {
...
public:
virtual void service(Msg& req, Msg& resp, bool flag) = 0;
...
};
class DBInterfaceMock : public DBInterface {
public:
MOCK_METHOD3(service, void(Msg& req, Msg& resp, bool flag));
};
该测试使用EXPECT_CALL
模拟此服务呼叫,如下所示
TEST_F(SessionTest, SessionInt) {
DBInterfaceMock mockDb;
Session* session = new Session(mockDb);
// DerivedMsg inherits from Msg and contains a map
DerivedMsg derivedMsg;
// populating the map inside the derivedMsg
// ...
// ...
EXPECT_CALL(mockDb, service(_, _, false))
.Times(1)
.WillDo(SetArgReferee<1>(*(dynamic_cast<Msg*>(&derivedMsg))));
session->init();
....
....
}
在调用session->init()
时,我希望模拟的服务调用必须返回derivedMsg
中填充的值。但是,即使在ASSERT
中返回的值已正确填充,代码也会遇到0
,其中地图大小为SetArgReferee
。
在生产代码中,一旦服务调用成功执行,通过对所需的派生类型执行dynamic_cast
来检索引用参数,如下所示。
service(req, resp, false);
DerivedMsg derivedResp = *(dynamic_cast<DerivedMsg*>(&resp));
uint16_t size = derivedResp.getMap().size(); //returns a 0 size.
有没有更好的方法来实现这一目标?它似乎没有这样工作。