【问题标题】:GMOCK how to assign values to function argumentsGMOCK如何为函数参数赋值
【发布时间】:2017-11-30 06:46:13
【问题描述】:

我有如下功能:

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

【问题讨论】:

  • 您想比较函数的参数和一些期望值吗?
  • 否 - 消息是一个抽象类,我想为请求/响应设置虚拟值 - 以便 FnCall 中的流会相应地运行
  • 我认为您以错误的方式使用模拟。当你使用 mock 时,你会模拟一些接口并期望在那个 mock 上调用模拟方法。
  • 是的,但是我们可以通过某种机制设置模拟方法函数参数 - 问题是我无法提供 Message 类型,因为它是一个抽象类,不确定如何将 MessageMock 转换为留言
  • 但那是在函数调用者上。函数调用者将提供该参数。如果测试是函数调用者,则让测试提供虚拟对象来完成接口,如果不是,系统的其余部分需要提供具体对象。

标签: c++ c++11 gmock


【解决方案1】:

你做错了。您的期望只是在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);

这里我提供虚拟值。

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

【讨论】:

  • 如果我们必须在您的示例中输入已知类型的参数(如 int),这一切都很好 - 但我这边的问题是输入参数 if 类型为 MyInterface 类 - 所以您的方法将具有以下签名- void method(MyInterface *, MyInterface*&) = 0。注意实际上会创建并传递 MyInterface 的对象。
  • 因此,就像您定义 Mock 对象一样,对虚拟对象执行相同的操作并将该虚拟对象提供给方法调用,如果您直接从测试中调用,如果不是其他人会为您的方法提供参数。
  • 好吧,我已经尝试过了——我需要一种机制,在 GMOCK 测试用例中 MessageMock 对象可以转换为 Message 并作为参数传递
  • 我已经添加了我在问题中遇到的问题详细信息
猜你喜欢
  • 2022-07-27
  • 2017-02-07
  • 2021-05-10
  • 2022-07-27
  • 2017-07-04
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多