我有如下功能:

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


在这里,我提供了虚拟值。

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

09-10 17:04