我有如下功能:
FnCall(request, response);
请求和答复类型属于类-消息。现在,我模拟了如下方法:
class MessageMock : public Message
{
public:
MOCK_METHOD2(FnCall, bool(const Message* request, Message*& response));
};
在我的测试案例中,我期望可以调用FnCall
EXPECT_CALL(mMessageMock, FnCall(::testing::_,::testing::_));
我的要求是在MessageMock类型的函数FnCall的request / response参数中设置一些虚拟值-我该如何设置呢?
================================================== =====================
我尝试了以下代码:
MessageMock MessageMock1, MessageMock2;
EXPECT_CALL(mMessageMock, FnCall(&mMessageMock1,
&mMessageMock2));
但是会收到编译错误,甚至尝试使用const声明:
error: no matching function for call to 'gmock_FnCall(MessageMock*, MessageMock*)'
note: candidate is:
note: testing::internal::MockSpec<bool(const Message*, Message*&)>&
note: no known conversion for argument 2 from 'MessageMock*' to 'const testing::Matcher<Message*&>&'
最佳答案
您做错了。您的期望只是在mMessageMock
上,因此该对象应该是模拟的。 (您期望在模拟实例上)测试是否是调用者:
mMessageMock.method(...)
您需要为该调用提供虚拟对象。
假设您有这样的界面:
class MyInterface{
public:
virtual void method(MyInterface*, MyInterface*) = 0;
};
您要检查的是在该接口上调用的某些方法。您定义模拟类,并对该模拟实例设置期望。
class MyMock : public MyInterface{
public:
MOCK_METHOD2(method, void(MyInterface*,MyInterface*);
};
为了进行测试,您需要提供Dummy对象以完成接口:
class MyDummy : public MyInterface{
public:
void method(MyInterface*, MyInterface*) override{}
};
因此,在您的测试中添加:
MyMock mock;
MyDummy request, response;
EXPECT_CALL(mock, method(&request, &response));
如果您想在没有其余代码的情况下进行测试。设置期望值后,只需在模拟实例上调用该方法即可。
mock.method(&request,&response);
在这里,我提供了虚拟值。
编辑:
更新以改善虚拟对象的使用。