针对多态参数的GoogleMock SetArgReferee行为

时间:2016-04-19 11:27:11

标签: c++ unit-testing googlemock

我正在尝试模拟数据库接口调用,并使用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.

有没有更好的方法来实现这一目标?它似乎没有这样工作。

0 个答案:

没有答案