模拟EXPECT_CALL的对象参数

时间:2017-06-09 01:19:05

标签: googletest gmock

我有一个简单的模拟类:

class MockCanInterface : public lib::CanInterface {
 public:
  MockCanInterface() : CanInterface({"mock"}) {}

  MOCK_METHOD1(Write, bool(const lib::CanFrame& frame));
  MOCK_METHOD1(Read, bool(lib::CanFrame* frame));
};

在测试代码中,我想将对象传递给Write方法。有没有办法用.With子句做到这一点?它适用于直接传递参数,但现在使用.With。代码编译,但在执行期间失败 - 对象的大小是正确的,但数据不是。

这有效:

EXPECT_CALL(can_, Write(expected_command_))
        .WillOnce(Return(true));

这不是:

EXPECT_CALL(can_, Write(_))
        .With(Args<0>(expected_command_))
        .WillOnce(Return(true));

我承认代码设置预期对象的方式可能会遗漏。

1 个答案:

答案 0 :(得分:0)

我认为重点是:方法Write()需要通过引用传递的CanFrame参数。

我建议使用GMock提供的操作
SetArgReferee - 参考或价值
SetArgPointee - 指针

您可以找到示例以及更多here

然而,这个解决方案对我有用,我也希望你;)

EXPECT_CALL(can_, Write(_))
        .WillOnce(SetArgReferee<0>(expected_command_));

或带有返回值:

EXPECT_CALL(can_, Write(_))
        .WillOnce(DoAll(SetArgReferee<0>(expected_command_), Return(true)));