OR 参数匹配器

OR argument matcher

#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;
    EXPECT_CALL(a, f(ContainerEq(v), ContainerEq(v1))).Times(1);
    // code will call f finally
    return 0;
}

我模拟的函数 f 将传入 2 个向量。然而,序列可能是随机的,v,v1 或 v1,v 都是正确的。如何在 EXPECT_CALL 中添加 OR 运算符,例如:

EXPECT_CALL(a, f(ContainerEq(v) or ContainerEq(v1), ContainerEq(v1) or ContainerEq(v))).Times(1);

可能吗?

是的,这可以使用 AnyOf:

EXPECT_CALL(a, f(AnyOf(ContainerEq(v),ContainerEq(v1)),
                 AnyOf(ContainerEq(v),ContainerEq(v1)));

使用 C++11 或更高版本,您还可以执行以下操作:

auto matcher = AnyOf(ContainerEq(v),ContainerEq(v1));

EXPECT_CALL(a, f(matcher, matcher));