如何针对包含位域的结构体使用Google Mock的Field匹配器?
如何针对包含位域的结构体使用Google Mock的Field匹配器?
哈哈,这个问题我之前踩过坑!Google Mock的Field匹配器确实没法直接用在位域上,毕竟C++本身就不允许取位域的地址,这就是你看到那个报错的核心原因。不过有几个实用的解决办法,我给你挨个说说:
方法一:用testing::Property替代Field
Property匹配器比Field灵活太多,它不需要成员指针,只要给它一个能提取属性的函数或者lambda就行。针对你的结构体,直接写个lambda提取位域值就搞定:
// 匹配y位域等于expected_y testing::Property([](const s& obj) { return obj.y; }, expected_y)
如果要同时匹配多个字段(比如x和y),用testing::AllOf组合起来就行:
testing::AllOf( testing::Field(&s::x, expected_x), testing::Property([](const s& obj) { return obj.y; }, expected_y) )
方法二:自定义专属匹配器(用MATCHER_P宏)
如果这个位域匹配会多次用到,不如直接写个专属匹配器,用Google Mock的MATCHER_P宏超方便:
MATCHER_P(HasYValue, expected, "Matches an s struct where y equals the expected value") { return arg.y == expected; } // 同理可以给z位域写一个 MATCHER_P(HasZValue, expected, "") { return arg.z == expected; }
用的时候直接写HasYValue(expected_y)就行,可读性拉满,代码也清爽。
方法三:给结构体加辅助成员函数(可选)
如果你的结构体允许修改,还可以加几个成员函数专门返回位域的值,这样用Property的时候更简洁:
struct s { uint32_t x; uint32_t y : 12; uint32_t z : 20; // 辅助函数,返回位域的值 uint32_t get_y() const { return y; } uint32_t get_z() const { return z; } };
然后匹配的时候就可以写成:
testing::Property(&s::get_y, expected_y)
这种方式适合需要频繁复用位域匹配的场景。
这几种方法都能完美避开位域不能取地址的限制,你可以根据自己的实际场景选最顺手的那个~
备注:内容来源于stack exchange,提问作者Dominik Kaszewski
相关产品推荐
相关产品推荐

