GMOCK如何为函数参数赋值

时间:2017-11-30 06:46:14

标签: c++ c++11 gmock

我有如下功能:

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*&>&'

1 个答案:

答案 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);

这里我提供虚拟值。

编辑: 更新以改进虚拟对象的使用。