Google Mock: renvoyer () une liste de valeurs

Via la méthode Return () de Google Mock, vous pouvez indiquer quelle valeur sera renvoyée une fois qu’une fonction simulée est appelée. Toutefois, si une fonction donnée doit être appelée plusieurs fois, vous souhaitez qu’elle renvoie à chaque fois une valeur prédéfinie différente.

Par exemple:

EXPECT_CALL(mocked_object, aCertainFunction (_,_)) .Times(200); 

Comment faites-vous une aCertainFunction chaque fois retourner un entier incrémentant?

Utilisez des séquences :

 using ::testing::Sequence; Sequence s1; for (int i=1; i<=20; i++) { EXPECT_CALL(mocked_object, aCertainFunction (_,_)) .InSequence(s1) .WillOnce(Return(i)); } 

Utilisez des foncteurs, comme expliqué ici .


Quelque chose comme ça :

 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 ); 

Vous pourriez aimer cette solution, qui cache les détails d’implémentation dans la classe fictive.

Dans la classe fictive, ajoutez:

 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; } 

Dans le test, appelez:

 TEST_F(TestSuite, TestScenario) { MockObject mocked_object; mocked_object.useAutoIncrement(0); // the rest of the test scenario ... }