如何在传递给模拟方法的对象上调用方法
How to invoke a method on a object passed to a mocked method
我对 gmock 的工作方式还很陌生。
我有一个带有 addEvent 方法的模拟,它通过指针获取类型为 MyClass 的对象。我需要在此对象上调用 MyClass::makeCall。
class SchedulerMock
{
public:
MOCK_CONST_METHOD1(addEvent, void(MyClass*));
};
我找到了这个主题:
What is the easiest way to invoke a member function on an argument passed to a mocked function?
还有例子:
IFooable* ifooable = new IFooableImpl(...);
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
.WithArg<0>(Invoke(&ifooable,&IFooable::Fooable));
但我不想对我在测试中创建的对象调用方法。我想让 mock 在实际传递给 mock 的对象上调用 makeCall。
因此,我可以将我的 mock 注入另一个 class,它将创建一些新对象,并在我的 schedulerMock 上调用 addEvent,我希望这个 mock 每次有人在我的 mock 上调用 addEvent 时,都会在传递的参数上调用 makeCall。
希望我说清楚了。
这可以吗?
您可以使用另一个调用模拟函数的函数...
class SchedulerMock
{
public:
//.... etc
void addEvent(MyClass* c) const
{
c->makeCall();
mockAddEvent(c); //Wholla, test still works and makeCall called.
}
MOCK_CONST_METHOD1(mockAddEvent, void(MyClass*));
};
您可以定义自定义操作(在命名空间范围内 - 在任何其他函数、测试等之外)。 Action 将有权访问模拟函数调用的参数,在本例中是您要在 makeCall
上调用的 MyClass *
:
ACTION(MakeCall)
{
// arg0 is predefined as 0-th argument passed to the mock function call,
// MyClass* in this case
arg0->makeCall();
}
TEST(...)
{
// Create mock object and set expectation, and specify to invoke the
// MakeCall Action
SchedulerMock mock;
EXPECT_CALL(mock, addEvent(_))
.WillOnce(MakeCall());
...
}
调用 mock.addEvent(my_class_ptr)
时,将使用给定的 MyClass *
指针调用 MakeCall
操作。
您还可以使用它来将测试中定义的参数传递给操作。例如,假设您的 MyClass::makeCall
方法接受了一个 int
参数,并且您想在第一次和第二次调用该方法时传递两个不同的值:
class MyClass
{
void makeCall(int);
};
ACTION_P(MakeCall, value)
{
arg0->makeCall(value);
}
TEST(...)
{
const int FIRST_VAL = 10;
const int SECOND_VAL = 20;
MyClass my_class_obj;
SchedulerMock mock;
EXPECT_CALL(mock, addEvent(_))
.WillOnce(MakeCall(FIRST_VAL))
.WillOnce(MakeCall(SECOND_VAL));
...
}
有关详细信息,请参阅 Google 模拟文档:
我对 gmock 的工作方式还很陌生。
我有一个带有 addEvent 方法的模拟,它通过指针获取类型为 MyClass 的对象。我需要在此对象上调用 MyClass::makeCall。
class SchedulerMock
{
public:
MOCK_CONST_METHOD1(addEvent, void(MyClass*));
};
我找到了这个主题: What is the easiest way to invoke a member function on an argument passed to a mocked function?
还有例子:
IFooable* ifooable = new IFooableImpl(...);
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
.WithArg<0>(Invoke(&ifooable,&IFooable::Fooable));
但我不想对我在测试中创建的对象调用方法。我想让 mock 在实际传递给 mock 的对象上调用 makeCall。 因此,我可以将我的 mock 注入另一个 class,它将创建一些新对象,并在我的 schedulerMock 上调用 addEvent,我希望这个 mock 每次有人在我的 mock 上调用 addEvent 时,都会在传递的参数上调用 makeCall。 希望我说清楚了。
这可以吗?
您可以使用另一个调用模拟函数的函数...
class SchedulerMock
{
public:
//.... etc
void addEvent(MyClass* c) const
{
c->makeCall();
mockAddEvent(c); //Wholla, test still works and makeCall called.
}
MOCK_CONST_METHOD1(mockAddEvent, void(MyClass*));
};
您可以定义自定义操作(在命名空间范围内 - 在任何其他函数、测试等之外)。 Action 将有权访问模拟函数调用的参数,在本例中是您要在 makeCall
上调用的 MyClass *
:
ACTION(MakeCall)
{
// arg0 is predefined as 0-th argument passed to the mock function call,
// MyClass* in this case
arg0->makeCall();
}
TEST(...)
{
// Create mock object and set expectation, and specify to invoke the
// MakeCall Action
SchedulerMock mock;
EXPECT_CALL(mock, addEvent(_))
.WillOnce(MakeCall());
...
}
调用 mock.addEvent(my_class_ptr)
时,将使用给定的 MyClass *
指针调用 MakeCall
操作。
您还可以使用它来将测试中定义的参数传递给操作。例如,假设您的 MyClass::makeCall
方法接受了一个 int
参数,并且您想在第一次和第二次调用该方法时传递两个不同的值:
class MyClass
{
void makeCall(int);
};
ACTION_P(MakeCall, value)
{
arg0->makeCall(value);
}
TEST(...)
{
const int FIRST_VAL = 10;
const int SECOND_VAL = 20;
MyClass my_class_obj;
SchedulerMock mock;
EXPECT_CALL(mock, addEvent(_))
.WillOnce(MakeCall(FIRST_VAL))
.WillOnce(MakeCall(SECOND_VAL));
...
}
有关详细信息,请参阅 Google 模拟文档: