通过 Google Mock 的 Return(),您可以返回调用模拟函数后将返回的值。但是,如果某个函数预计会被多次调用,并且每次您希望它返回不同的预定义值。
例如:
EXPECT_CALL(mocked_object, aCertainFunction (_,_))
.Times(200);
你如何让aCertainFunction
每次返回一个递增的整数?
通过 Google Mock 的 Return(),您可以返回调用模拟函数后将返回的值。但是,如果某个函数预计会被多次调用,并且每次您希望它返回不同的预定义值。
例如:
EXPECT_CALL(mocked_object, aCertainFunction (_,_))
.Times(200);
你如何让aCertainFunction
每次返回一个递增的整数?
使用序列:
using ::testing::Sequence;
Sequence s1;
for (int i=1; i<=20; i++) {
EXPECT_CALL(mocked_object, aCertainFunction (_,_))
.InSequence(s1)
.WillOnce(Return(i));
}
使用仿函数,如此处所述。
像这样的东西:
int aCertainFunction( float, int );
struct Funct
{
Funct() : i(0){}
int mockFunc( float, int )
{
return i++;
}
int i;
};
// in the test
Funct functor;
EXPECT_CALL(mocked_object, aCertainFunction (_,_))
.WillRepeatedly( Invoke( &functor, &Funct::mockFunc ) )
.Times( 200 );
您可能会喜欢这个解决方案,它在模拟类中隐藏了实现细节。
在模拟类中,添加:
using testing::_;
using testing::Return;
ACTION_P(IncrementAndReturnPointee, p) { return (*p)++; }
class MockObject: public Object {
public:
MOCK_METHOD(...)
...
void useAutoIncrement(int initial_ret_value) {
ret_value = initial_ret_value - 1;
ON_CALL(*this, aCertainFunction (_,_))
.WillByDefault(IncrementAndReturnPointee(&ret_value));
}
private:
ret_value;
}
在测试中,调用:
TEST_F(TestSuite, TestScenario) {
MockObject mocked_object;
mocked_object.useAutoIncrement(0);
// the rest of the test scenario
...
}