C++ Google se Moquer de SaveArg : comment enregistrer un argument pointeur
J'ai de la difficulté à l'enregistrement d'un pointeur argument que mon mock reçoit.
#define SIZE_OF_DATA
typedef struct {
uint32_t someValue1;
uint16_t someValue2;
//other values here
} LargeStruct;
class SomeClass {
public:
//assume sendData is a generic function where data is actually pointer to a LargeStruct
void sendData(const uint8_t* data, const uint16_t size);
}
class MockClass : public SomeClass {
public:
MOCK_METHOD2(sendData, void(const uint8_t*, const uint16_t));
};
Je veux sauver le premier argument de sendData (le pointeur) et de regarder les données des points d' (il pointe vers une grande structure, donc je ne veux pas de copie par valeur):
TEST(SomeFixture, sendData_checkSentDataIsValid) {
MockClass mock;
const uint8_t *pData;
EXPECT_CALL(mock, sendData(_, SIZE_OF_DATA)).WillOnce(SaveArg<0>(&pData));
//do something here that calls sendData()
//hopefully data should point to the same data that was passed in to the method
LargeStruct *ls = (LargeStruct *)pData;
//now verify that the data is ok...
//some expectations here
EXPECT_EQ(SOMEVALUEIWANT, ls->someValue1);
}
Toutefois, les données pointées par pData, à tort je pense que je semble être de sauver la valeur du pointeur dans la structure, plutôt que de sauver le pointeur.
Je pense que le problème réside dans la variable je passe à SaveArg, mais je n'arrive pas à l'obtenir en une version qui compile et qui me donne la bonne réponse. Tous les pointeurs s'il vous plaît?
OriginalL'auteur John | 2014-09-17
Vous devez vous connecter pour publier un commentaire.
J'ai juste couru dans la même situation, et dans mon cas, j'ai dû faire en sorte que le pointeur passé en l'équivalent de votre sendData() la fonction n'était pas de pointage automatique variable sur la pile. Sinon, au moment où vous accédez à l'aide du pointeur, le contenu aura changé. J'ai constaté que moins utile, j'ai donc décidé de définir une mesure alternative à SaveArg comme ceci:
Vous pouvez alors l'utiliser comme ceci:
OriginalL'auteur Dale Stewart
Vous pouvez en créer un vide pointeur comme un tampon et d'enregistrer argument à l'intérieur de la mémoire tampon. Après cela, vous devriez jeter la mémoire tampon de votre grande structure.
OriginalL'auteur Igor Mišić