首页 > 解决方案 > 在 EXPECT_CALL 中使用变量

问题描述

我有一个用于串行接口的简单模拟类:

class MockSerialPort : public drivers::SerialPort
{
  public:
    MockSerialPort() : SerialPort(){};

    MOCK_METHOD((Result<size_t>), Read, (uint8_t *, size_t, (const duration<int64_t, std::micro> &)), (override));
    MOCK_METHOD((Result<size_t>), Write, (const uint8_t *, size_t), (override));
};

在预期的Read调用期间,我想知道调用代码期望的缓冲区长度,以便我可以正确地将数据复制到缓冲区。例如:

EXPECT_CALL(port_, Read(NotNull(),length,_))
                .WillOnce(DoAll(SetArrayArgument<0>(&data[0], &data[length]), Return(length)));

正确的语法是什么?如果我如上所述指定变量,那么其中的值就是我们所期望的。但是我如何不使期望调用失败并实际存储调用者Read指定的值?

标签: c++c++11googlemock

解决方案


在这种“复杂”的情况下 - 使用 lamdba 表达式 - 或其他一些函数,仿函数对象:


EXPECT_CALL(port_, Read(NotNull(),_ ,_))
                .WillOnce([](uint8_t *data, size_t length, const duration<int64_t, std::micro> &) {
   // do with data and length whatever you want
   return length;
});

从 gtest1.10 开始这是可能的 - 但从您使用 MOCK_METHOD 的事实来看 - 我看到您使用的是最新的 gtest。

简而言之 -DoAll(....)用一些仿函数对象替换 - 比如 lambda 表达式。


推荐阅读