我有如下功能:
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中的请求/响应参数中设置一些虚拟值 - 我该如何设置?
=============================================== ========================
我尝试了以下代码:
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*&>&'
答案 0 :(得分:1)
你做错了。你的期望只在mMessageMock
上,所以这个对象应该是模拟的。 (你期望在mock实例上)如果测试是调用者:
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);
这里我提供虚拟值。
编辑: 更新以改进虚拟对象的使用。