c++ - 在 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
指定的值?
解决方案
在这种“复杂”的情况下 - 使用 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 表达式。
推荐阅读
- android - Android 开源项目 (AOSP) 是否已经在 android SDK 中
- css - CSS - 带有图像的简单动画
- python - 查找和替换字符之间的字符串
- uiview - Swift 4 反向改变 UIView 的高度
- dialogflow-es - 帮助 Dialogflow 的食谱?
- autodesk-forge - 在 Forge Viewer 中更改模型浏览器的内容
- node.js - 用户在 Node.JS 中登录时快速会话出错
- python - SymPy 秩与 NumPy 矩阵秩不同
- android - 在 ppi 较小的设备上,字体和图标看起来很暗淡且像素化
- reactjs - 通过 props 将 PropTypes 值传递给有状态的 React 子组件