如何匹配通过引用传递给模拟函数的结构字段
How to match a field of a struct which is passed by reference to a mocked function?
我有以下结构:
struct can_frame {
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
__u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
__u8 __pad; /* padding */
__u8 __res0; /* reserved / padding */
__u8 __res1; /* reserved / padding */
__u8 data[CAN_MAX_DLEN] __attribute__((aligned(8)));
};
我通过引用模拟函数来传递结构: MOCK_METHOD1(write, int(can_frame* frame));
如果传递结构在数据字段中具有给定的数字,我想匹配: EXPECT_CALL(*canSocketMock_, write(**if the value of can_frame->data[1] is equal to 10, else assert false**))).WillOnce(Return(16));
我尝试将Pointee,Field和ArrayElement匹配器组合在一起,但未能创建我想要的东西。匹配器的语法对我来说有点太混乱了。
编辑:测试:
TEST_F(SchunkDeviceShould, applyBreakWritesRightMessage) {
ASSERT_NO_THROW(sut_.reset(new SchunkDevice(
canSocketMock_, 3)));
can_frame frame;
EXPECT_CALL(*canSocketMock_, write(FrameDataEquals(&frame, 1, CMD_STOP)))).WillOnce(Return(16));
ASSERT_TRUE(sut_->applyBreak());
}
我们调用的函数:
bool SchunkDevice::applyBreak() {
can_frame frame;
frame.can_id = MESSAGE_TO_DEVICE+canID_;
frame.can_dlc = 0x02;
frame.data[0] = frame.can_dlc - 1;
frame.data[1] = CMD_STOP;
if (int len = socket_->write(&frame) != 16) {
return false;
}
return true;
}
测试输出:
Unexpected mock function call - taking default action specified at:
/home/../SchunkDeviceTests.cpp:47:
Function call: write(0x7ffc27c4de60)
Returns: 16
Google Mock tried the following 1 expectation, but it didn't match:
/home/../SchunkDeviceTests.cpp:457: EXPECT_CALL(*canSocketMock_, write(FrameDataEquals(&frame, 1, CMD_STOP)))...
Expected arg #0: frame data equals (0x7ffc27c4def0, 1, 145)
Actual: 0x7ffc27c4de60
Expected: to be called once
Actual: never called - unsatisfied and active
您可以定义自定义匹配器来检查结构内容。
MATCHER_P2(FrameDataEquals, index, value, "") { return (arg->data[index] == value); }
然后,您将像这样使用它:
EXPECT_CALL(mock, write(FrameDataEquals(1, 10))).WillOnce(Return(16));
相关文章:
- 模拟成员函数调用 lambda
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 如何反复调用函数直到满足模拟?
- 在类 gtest/gmock 进行单元测试时模拟成员函数C++
- 如何在不诉诸依赖注入的情况下模拟遗留函数?
- 如何使用gmock模拟修改C++类中私有变量的成员函数
- 没有用于初始化模拟工厂的匹配构造函数
- 谷歌模拟嘲笑非虚拟函数
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 模拟 __name__ = __main__ 在 c++ 中会导致错误"未定义类似函数的宏"
- gmock - 如何使用 noexcept 说明符模拟函数
- 是否可以使用 EXPECT_CALL 来验证模拟对象的构造函数是否在某些时候调用成员函数?
- 模拟一个函数,该函数像操作员=和破坏者一样传播到每个字段
- 如何在C++中模拟模板化的 std::函数
- 将模板函数声明为非模拟函数的参数
- 使用 atan2() 函数模拟中的奇怪"yaw"行为
- 使用参数构造函数模拟new[]