如何在GMock中用OR参数匹配器测试带vector参数的类函数?
在Google Test/Mock中结合OR匹配器校验vector参数
嘿,我来帮你搞定这个问题!要在Google Mock里对AA::f的vector参数做OR逻辑的匹配校验,核心是用Google Mock提供的AnyOf匹配器(它就是用来实现“或”逻辑的),搭配ContainerEq这类专门校验容器的匹配器就可以了。下面分几种常见场景给你举例说明:
场景1:单个参数满足OR条件
如果我们希望f的第一个vector参数要么等于v({3,2,1}),要么等于v1({1,2,3}),同时第二个参数固定等于v1,可以这么写:
#include <vector> #include "gtest/gtest.h" #include "gmock/gmock.h" using namespace ::testing; class A { public: virtual void f(std::vector<int>& b, std::vector<int>& b1) { } }; class AA : public A { public: MOCK_METHOD2(f, void(std::vector<int>&, std::vector<int>&)); }; int main() { std::vector<int> v = { 3,2,1 }; std::vector<int> v1 = { 1,2,3 }; AA a; // 第一个参数满足v或v1,第二个参数必须等于v1 EXPECT_CALL(a, f(AnyOf(ContainerEq(v), ContainerEq(v1)), ContainerEq(v1))) .Times(1); // 测试调用示例:传入v和v1会匹配成功 std::vector<int> test_v = v; std::vector<int> test_v1 = v1; a.f(test_v, test_v1); // 传入v1和v1同样会匹配成功 // a.f(test_v1, test_v1); return RUN_ALL_TESTS(); }
AnyOf(m1, m2, ...)会匹配满足任意一个内部匹配器的参数,完美实现OR逻辑。
场景2:两个参数的组合满足OR条件
如果你的需求是要么(第一个参数是v且第二个是v1),要么(第一个参数是v1且第二个是v),这时候需要用With来指定参数组合的匹配规则,结合AnyOf和AllOf(实现“与”逻辑):
EXPECT_CALL(a, f(_, _)) .With(AnyOf( AllOf(Arg0(ContainerEq(v)), Arg1(ContainerEq(v1))), AllOf(Arg0(ContainerEq(v1)), Arg1(ContainerEq(v))) )) .Times(1);
这里Arg0指代第一个参数,Arg1指代第二个参数,AllOf用来组合“同时满足多个条件”,再用AnyOf把两组条件包裹起来,就实现了参数组合的OR校验。
额外注意点
因为AA::f的参数是std::vector<int>&(非const引用),测试时传入的vector必须是可修改的(不能是临时对象),否则会触发编译错误,这点和你原来的代码逻辑一致,不用额外调整。
内容的提问来源于stack exchange,提问作者jean
相关产品推荐
相关产品推荐

