2017-06-09 2 views
1

J'ai une simple classe Mock:argument objet pour se moquer de EXPECT_CALL

class MockCanInterface : public lib::CanInterface { 
public: 
    MockCanInterface() : CanInterface({"mock"}) {} 

    MOCK_METHOD1(Write, bool(const lib::CanFrame& frame)); 
    MOCK_METHOD1(Read, bool(lib::CanFrame* frame)); 
}; 

Dans le code de test, je veux passer un objet à la méthode Write. Y at-il un moyen de le faire avec la clause .With? Cela fonctionne avec l'argument passant directement, mais maintenant avec .With. Le code compile, mais échoue lors de l'exécution - la taille de l'objet est correcte, mais les données ne le sont pas.

Cela fonctionne:

EXPECT_CALL(can_, Write(expected_command_)) 
     .WillOnce(Return(true)); 

Cela ne signifie pas:

EXPECT_CALL(can_, Write(_)) 
     .With(Args<0>(expected_command_)) 
     .WillOnce(Return(true)); 

Je reconnais qu'il peut y avoir quelque chose qui manque dans la façon dont le code définit l'objet attendu.

Répondre

0

Je pense que le point est: La méthode write() a nécessité un argument CanFrame passé par référence.

Je suggère d'utiliser les actions fournies par GMock:
SetArgReferee - valeur de référence ou
SetArgPointee - pointeur

Vous pouvez trouver des exemples et beaucoup plus here

Cependant, cette solution fonctionne pour moi , J'espère pour toi aussi;)

EXPECT_CALL(can_, Write(_)) 
     .WillOnce(SetArgReferee<0>(expected_command_)); 

ou avec la valeur de retour:

EXPECT_CALL(can_, Write(_)) 
     .WillOnce(DoAll(SetArgReferee<0>(expected_command_), Return(true))); 
+0

grâce à la solution. Avez-vous essayé le code avec une fausse 'Write' en prenant' const lib :: CanFrame & '? Je continue à obtenir cette erreur 'erreur: en passant « const lib :: CanFrame » comme les rejets « ce » l'argument qualifiers' – ilya1725

+0

vous avez raison. Cela ne fonctionne qu'avec une référence non-const. Je ne peux pas trouver de solution à un argument de référence const. Cependant, je laisse ma réponse ici, peut-être aider quelqu'un à trouver la bonne réponse. – Soeren