在 EXPECT_CALL 中使用变量

use of variable in EXPECT_CALL

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

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

正确的语法是什么?如果我像上面那样指定变量,那么它的值就是我们期望的。但是我如何才能不让 expect 调用失败并实际存储 Read 的调用者指定的值?

在这种“复杂”的情况下 - 使用 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 表达式。