- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
A 类正在测试中,我希望 EXPECT_CALL 立即返回,并为模拟的 asyncfunc() 方法调用值为 200(右值引用)的 lamda 函数。请阅读符合代码的注释 #include "gtes
我的 mock 定义如下: template class ParseTreeMock : public ParseTreeInterface { public: MOCK_ME
有没有办法在函数的局部对象上使用 EXPECT_CALL? 例如: template std::string doSomethingWithTheCar() { T car; retu
我知道 EXPECT_CALL 应该用于模拟类及其对象/方法。但是有没有可能使用它来期望调用本地方法? void Sample::Init() { // some codes here...
我正在使用 gtest & gmock 并希望对使用集合调用的函数设置期望值。我想确保这个集合包含多个元素。 像这样: EXPECT_CALL(*mView, SetHighlightedCells(
我有一个类通过调用 subscribe(callbackfunction) 来“订阅”来自组件的信号。我现在正尝试通过保存回调并稍后向其发送数据以测试该组件的其他部分来使用 gtest/gmock 测
我有一个类,其中包含几个相互依赖的方法。让我们说 foo()、bar() 和 baz()。 当我测试 bar() 时我需要模拟 foo() 的行为,当我测试 baz() 时我需要模拟 bar() 的行
我有一个用于串行接口(interface)的简单模拟类: class MockSerialPort : public drivers::SerialPort { public: MockS
我有一些期望,比如 EXPECT_CALL (...) EXPECT_CALL(t1, foo()).Times(1); 我想创建相反的。 我期望某个函数不会被执行 . 我应该使用什么方法? 类似 E
我有两个模拟。一次运行只应调用其中一个,我想在不知道给定先决条件的情况下使用期望来确定 execute() 函数是否成功。 如何实现? Mock1 successMock; Mock2 failMoc
#include "gtest\gtest.h" using namespace testing; class MyGTest : public Test { public: void f()
我有一个类,其构造函数调用一个成员函数,该成员函数又调用其他成员函数。我想使用 GMock 创建一个模拟类,并验证在构造模拟类对象时,这些成员函数在构造过程中被调用了一次。但我观察到以下困境: 一方面
我是 Gmock 的新手。我尝试了一个例子,但它是错误的。我也引用了该组的一些帖子,但对我没有帮助。 class MATH { public: virtual ~MATH(){} virt
测试用例应断言调用了资源的方法tagcache(),以确保更新资源的标签缓存。我知道调用了该方法,但测试失败,因为: Expected: to be called at least once Actu
我在 C 中有以下代码想使用谷歌测试框架进行测试: a.h void getValue(int age, int * value); a.c #include void getValue(int a
我刚刚开始使用 GoogleTest 和 GoogleMock。阅读"for dummies" documentation该示例测试依赖于 Turtle 的 Painter 类: 真实对象-Turtl
Google Mock documentation说: Important note: Google Mock requires expectations to be set before the m
我必须遵循模拟函数 DoSomething(const char* par0, const char* par2) DoSomething2(std::string); 我将 DoSomething
struct obj { int a; string str; string str2; bool operator==(const obj& o) const { if
我对 Google Mock 还是很陌生,所以边学边学。我刚刚添加了一些单元测试,但遇到了一个问题,我无法让 ON_CALL() 正确地 stub 从方法内部调用的方法。 下面的代码概述了我所拥有的;
我是一名优秀的程序员,十分优秀!