如何仅用Googletest内置匹配器实现向量组的全无序匹配?
在Googletest中用内置匹配器实现双层无序向量组匹配
完全可以通过嵌套使用Googletest的内置匹配器实现需求,不需要自定义MATCHER_P。核心思路是外层用UnorderedElementsAre匹配整个向量组的任意排列,内层给每个子向量用UnorderedElementsAre(或数组版本)匹配元素的任意排列,具体用法如下:
基础写法(直接枚举子向量元素)
如果预期的子向量元素可以直接写出,直接嵌套UnorderedElementsAre即可:
#include <gtest/gtest.h> #include <vector> TEST(VectorMatcherTest, DoubleUnorderedMatch) { std::vector<std::vector<int>> actual = {{5,4,3}, {2,1}}; EXPECT_THAT(actual, UnorderedElementsAre( UnorderedElementsAre(1, 2), UnorderedElementsAre(3, 4, 5) )); }
基于数组的写法(适合复用预期子向量)
如果预期的子向量已经存储在变量中,可以用UnorderedElementsAreArray简化代码:
TEST(VectorMatcherTest, DoubleUnorderedMatchWithArrays) { std::vector<int> expected_sub1 = {1, 2}; std::vector<int> expected_sub2 = {3, 4, 5}; std::vector<std::vector<int>> actual = {{5,4,3}, {2,1}}; EXPECT_THAT(actual, UnorderedElementsAre( UnorderedElementsAreArray(expected_sub1), UnorderedElementsAreArray(expected_sub2) )); }
原理说明
UnorderedElementsAre是Googletest公开的匹配器,用于匹配容器内元素的任意排列,它接受多个子匹配器作为参数,每个子匹配器对应匹配容器中的一个元素。- 这里给外层
UnorderedElementsAre传入的子匹配器就是UnorderedElementsAre/UnorderedElementsAreArray,刚好能匹配每个子向量内部元素的任意排列,完美契合双层无序的匹配需求。 - 该方案会自动区分不同长度的子向量,不会出现长度不匹配的误判。
无需依赖内部实现的UnorderedElementsAreArrayMatcher,公开的内置匹配器组合完全可以满足需求。
内容的提问来源于stack exchange,提问作者user2309292
相关产品推荐
相关产品推荐

