通过Google Mock的Return(),您可以返回调用模拟函数后返回的值。但是,如果期望某个函数被多次调用,并且每次您希望它返回不同的预定义值。
例如:
EXPECT_CALL(mocked_object, aCertainFunction (_,_))
.Times(200);
每次返回递增整数时如何使aCertainFunction
?
答案 0 :(得分:5)
使用sequences:
using ::testing::Sequence;
Sequence s1;
for (int i=1; i<=20; i++) {
EXPECT_CALL(mocked_object, aCertainFunction (_,_))
.InSequence(s1)
.WillOnce(Return(i));
}
答案 1 :(得分:3)
使用仿函数,如here所述。
这样的事情:
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 );
答案 2 :(得分:0)
您可能会喜欢这个解决方案,它隐藏了模拟类中的实现细节。
在mock类中,添加:
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
...
}