gpt4 book ai didi

c++ - 如何在 gmock expect_call 中对结构参数进行部分匹配

转载 作者:行者123 更新时间:2023-12-02 10:28:50 28 4
gpt4 key购买 nike

struct obj
{
int a;
string str;
string str2;
bool operator==(const obj& o) const
{
if(a == o.a && str == o.str && str2 == o.str2) return true;
return false;
}
}

然后在类中的函数中,它使用结构对象作为输入参数:

bool functionNeedsToBeMocked(obj& input)
{
//do something
}

现在我要做的是,

EXPECT_CALL(*mockedPointer, functionNeedsToBeMocked( /* if input.a == 1 && input.str == "test" && input.str2.contains("first")*/  )).Times(1).WillOnce(Return(true));

输入值为

inputFirst.a = 1;
inputFirst.str = "test";
inputFirst.str2 = "something first";

我希望 inputFirst 可以匹配到我的 EXPECT_CALL。

我如何使用 EXPECT_CALL 匹配器来做到这一点?

我看到了

EXPECT_CALL(foo, DoThat(Not(HasSubstr("blah")),
NULL));

在 gmock 食谱上,但我不知道如何为结构参数执行 HasSubStr。

最佳答案

您可以为 obj 结构实现自己的匹配器。

当你输入时:

EXPECT_CALL(*mockedPointer, functionNeedsToBeMocked(some_obj)).Times(1).WillOnce(Return(true));

然后 gmock 使用默认匹配器 Eq,使用 some_obj 作为其预期参数,并将实际的 functionNeedsToBeMocked 参数用作 arg 在匹配器中。 Eq 匹配器将默认调用 bool operator== 用于预期和实际对象:

EXPECT_CALL(*mockedPointer, functionNeedsToBeMocked(Eq(some_obj))).Times(1).WillOnce(Return(true));

但是,由于您不想使用 bool operator==,您可以编写自定义匹配器(删除 Times(1),因为它是默认值还有一个):

// arg is passed to the matcher implicitly
// arg is the actual argument that the function was called with
MATCHER_P3(CustomObjMatcher, a, str, str2, "") {
return arg.a == a and arg.str == str and (arg.str2.find(str2) != std::string::npos);
}
[...]
EXPECT_CALL(*mockedPointer, functionNeedsToBeMocked(CustomObjMatcher(1, "test", "first"))).WillOnce(Return(true));

可以使用 Field 匹配器和内置匹配器作为 HasString 组合自定义匹配器,但让我们“将其作为练习留给读者”:P

更新:带有 Field 匹配器的完整代码:

struct obj {
int a;
std::string str;
std::string str2;
};

struct Mock {
MOCK_METHOD(bool, functionNeedsToBeMocked, (obj&));
};

// creates a matcher for `struct obj` that matches field-by-field
auto Match(int expected_a, std::string expected_str1, std::string expected_substr2) {
return testing::AllOf(
testing::Field(&obj::a, expected_a),
testing::Field(&obj::str, expected_str1),
testing::Field(&obj::str2, testing::HasSubstr(expected_substr2))
);
}

TEST(MyTest, test) {
Mock mock{};

obj inputFirst;
inputFirst.a = 1;
inputFirst.str = "test";
inputFirst.str2 = "something first";

EXPECT_CALL(mock, functionNeedsToBeMocked(Match(1, "test", "first"))).Times(1).WillOnce(Return(true));

mock.functionNeedsToBeMocked(inputFirst);
}

关于c++ - 如何在 gmock expect_call 中对结构参数进行部分匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63140924/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com