You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:54:03