我在我的项目中使用gmock,我遇到了为mock函数设置自定义引用变量的问题.假设我有一个如下课程:
class XXXClient {
public:
void QueryXXX(const Request&, Response&);
};
class XXXRunner {
public:
void DoSomething(XXXClient&);
};
Run Code Online (Sandbox Code Playgroud)
使用XXXClient :: QueryXXX有一个Client Class XXXRunner :: DoSomething,我想模拟XXXClient来测试XXXRunner :: DoSomething.
问题是QueryXXX的第二个参数,即'Response',不是返回值,而是一个引用变量,我将一些数据填入XXXClient :: QueryXXX中的Response中.我想为Response设置自定义数据以验证XXXRunner :: DoSomething的不同条件.
gmock框架可以设置预期的返回值,但我找不到设置"返回变量"的方法?
那怎么办?
bou*_*eli 17
首先,创建一个XXXClient
模拟类,让我们将它命名XXXClientMock
为:
class XXXClientMock : public XXXClient
{
public:
MOCK_METHOD2(QueryXXX, QueryResult (Request&, Response&));
};
Run Code Online (Sandbox Code Playgroud)
然后,使用GMock Action SetArgReferee
设置自定义参数,如下所示:
TEST(XXXRunnerTC, SetArgRefereeDemo)
{
XXXCLientMock oMock;
// set the custom response object
Response oRsp;
oRsp.attr1 = “…”;
oRsp.attr2 = “any thing you like”;
// associate the oRsp with mock object QueryXXX function
EXPECT_CALL(oMock, QueryXXX(_, _)).
WillOnce(SetArgReferee<1>(oRsp));
// OK all done
// call QueryXXX
XXXRunner oRunner;
QueryResult oRst = oRunner.DoSomething(oMock);
…
// use assertions to verity your expectation
EXPECT_EQ(“abcdefg”, oRst.attr1);
……
}
Run Code Online (Sandbox Code Playgroud)
总结
GMock提供了一系列操作来方便模拟函数,例如SetArgReferee
用于引用或值,SetArgPointee
用于指针,Return
用于返回,Invoke
用于调用自定义模拟函数(使用简单的测试逻辑),您可以在此处查看更多详细信息.
享受吧:)谢谢
归档时间: |
|
查看次数: |
11898 次 |
最近记录: |