在 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 表达式。
我有一个用于串行接口的简单模拟 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 表达式。