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



与Gmock匹配结构中的问题不同,我想知道如何为具有两个成员的结构创建匹配器。假设我有一个包含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应该如何实现,你有什么建议/例子吗?或者,我可以不使用匹配器来解决这个问题吗?我想检查my_struct的每个元素

你自己的答案是可以的,但是有更好的方法。为提高gtest日志的可读性,最好提供流操作符或PrintTo函数。

并且可以强制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);
}

当测试发现一些问题时,这种小开销会付出很大的代价。

现场演示

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文档中有更多示例就更好了。

最新更新