Gmock - 具有两个以上变量的匹配结构

Gmock - matching structures with more than two vairables

Gmock - matching structures 中的问题不同,我想知道如何为具有 >2 个成员的结构创建匹配器。假设我有一个包含 8 个成员的结构,并且 MyFun() 将指向 SomeStruct_t 的指针作为参数。

typedef struct
{
  int data_1;
  int data_2;
  int data_3;
  int data_4;
  int data_5;
  int data_6;
  int data_7;
  int data_8;
} SomeStruct_t;

SomeStruct_t my_struct;

EXPECT_CALL(*myMock, MyFun(MyMatcher(my_struct)));

关于 MyMatcher 应该如何实施,您有什么 suggestions/examples 吗?或者,我可以在不使用匹配器的情况下解决这个问题吗?我想检查 my_struct.

的每个元素
MATCHER_P(MyMatcher, MyStruct, "arg struct does not match expected struct")
{
  return (arg.data_1 == MyStruct.data_1) && (arg.data_2 == MyStruct.data_2)  &&
    (arg.data_3 == MyStruct.data_3)  && (arg.data_4 == MyStruct.data_4)  &&
    (arg.data_5 == MyStruct.data_5)  && (arg.data_6 == MyStruct.data_6)  &&
    (arg.data_7 == MyStruct.data_7) && (arg.data_8 == MyStruct.data_8);
}

这解决了我的问题。虽然在 gmock 文档中有更多示例会很好。

你自己的答案没问题,但还有更好的方法。最好提供流运算符或 PrintTo 函数以提高 gtest 日志的可读性。

并且可以在失败的情况下强制 GTest 为匹配器打印更好的消息。

using testing::AllOf;
using testing::ExplainMatchResult;
using testing::Field;
using testing::Not;

std::ostream& operator<<(std::ostream&  out, const SomeStruct_t& data)
{
    return out << '{' 
        << data.data_1 << ','
        << data.data_2 << ','
        << data.data_3 << ','
        << data.data_4 << ','
        << data.data_5 << ','
        << data.data_6 << ','
        << data.data_7 << ','
        << data.data_8 << '}';
}

MATCHER_P(MyMatcher, myStruct, "")
{
    return ExplainMatchResult(
        AllOf(Field("data_1", &SomeStruct_t::data_1, myStruct.data_1),
              Field("data_2", &SomeStruct_t::data_2, myStruct.data_2),
              Field("data_3", &SomeStruct_t::data_3, myStruct.data_3),
              Field("data_4", &SomeStruct_t::data_4, myStruct.data_4),
              Field("data_5", &SomeStruct_t::data_5, myStruct.data_5),
              Field("data_6", &SomeStruct_t::data_6, myStruct.data_6),
              Field("data_7", &SomeStruct_t::data_7, myStruct.data_7),
              Field("data_8", &SomeStruct_t::data_8, myStruct.data_8)),
              arg, result_listener);
}

这种小东西在测试发现问题的时候会付出很多。

Live demo