You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:25:15