Gmock如何为超过2个成员的结构体实现自定义匹配器MyMatcher
Gmock多成员结构体匹配实现方案
自定义MyMatcher匹配器实现
你可以直接用Gmock提供的MATCHER_P宏实现自定义匹配器,由于MyFun的入参是结构体指针,匹配器内部需要先做非空校验再逐成员比对:
MATCHER_P(MyMatcher, expected_struct, "all fields of SomeStruct_t match expected value") { // arg为传入MyFun的结构体指针,先判空避免访问崩溃 if (arg == nullptr) { *result_listener << "input struct pointer is null"; return false; } // 逐成员比对 return arg->data_1 == expected_struct.data_1 && arg->data_2 == expected_struct.data_2 && arg->data_3 == expected_struct.data_3 && arg->data_4 == expected_struct.data_4 && arg->data_5 == expected_struct.data_5 && arg->data_6 == expected_struct.data_6 && arg->data_7 == expected_struct.data_7 && arg->data_8 == expected_struct.data_8; }
实现后即可直接使用你示例中的写法完成调用校验。
无需自定义匹配器的替代方案
有两种原生方案可以直接实现校验,不需要单独定义匹配器:
- 方案1:组合使用内置的
Pointee+FieldsAre匹配器
对于你这种聚合类型的C风格结构体,可以直接用FieldsAre按声明顺序匹配所有成员,Pointee用于提取指针指向的内容:
该方案不需要额外写适配代码,仅需要注意成员顺序和结构体声明顺序保持一致即可。EXPECT_CALL(*myMock, MyFun(::testing::Pointee(::testing::FieldsAre( my_struct.data_1, my_struct.data_2, my_struct.data_3, my_struct.data_4, my_struct.data_5, my_struct.data_6, my_struct.data_7, my_struct.data_8 )))); - 方案2:重载结构体
==运算符后使用Eq匹配器
如果你的项目中多处需要比对该结构体,可以先为结构体重载==运算符:
之后直接用bool operator==(const SomeStruct_t& lhs, const SomeStruct_t& rhs) { return lhs.data_1 == rhs.data_1 && lhs.data_2 == rhs.data_2 && lhs.data_3 == rhs.data_3 && lhs.data_4 == rhs.data_4 && lhs.data_5 == rhs.data_5 && lhs.data_6 == rhs.data_6 && lhs.data_7 == rhs.data_7 && lhs.data_8 == rhs.data_8; }Eq匹配器即可完成全量成员校验:
该方案写法最简洁,重载的EXPECT_CALL(*myMock, MyFun(::testing::Pointee(::testing::Eq(my_struct))));==运算符也可用于其他业务逻辑的比对场景。
内容的提问来源于stack exchange,提问作者jack_h
相关产品推荐
相关产品推荐

