Gmock d'appariement de structures
Comment puis-je correspondre à la valeur d'un élément dans une union pour un argument d'entrée électronique.g - si j'ai simulé une méthode avec le suivant signatiure -
struct SomeStruct
{
int data1;
int data2;
};
void SomeMethod(SomeStruct data);
Comment puis-je match que se moquer de cette méthode a été appelée avec la valeur correcte en argument?
- Vouliez-vous dire de définir
SomeStruct
qu'un syndicat? - oui désolé structure ou d'une union , est-il possible?
Vous devez vous connecter pour publier un commentaire.
Après la lecture par le biais de Google se moquer de la documentation dans le détail, j'ai résolu mon problème comme indiqué dans La Définition De Rapprochement section. (Un exemple aurait été génial!)
Donc la solution est d'utiliser le
MATCHER_P
de macros pour définir une correspondance personnalisée. Donc pour la mise en correspondanceSomeStruct.data1
j'ai défini une matcher:de le faire correspondre à une attente, j'ai utilisé cette coutume macro comme ceci:
Ici,
expectedSomeStruct
est la valeur de lastructure.data1
nous attendent.Remarque que, comme dans d'autres réponses (dans ce post et d'autres), il nécessite l'unité sous test à modifier pour rendre testable. Qui ne devrait pas être nécessaire! E. g. la surcharge.
MATCHER
ici était exactement ce qui m'a aidé à résoudre mon problème!Google fournit quelques bonnes documentation sur l'utilisation de gmock, plein de code en exemple. Je vous recommande vivement de vérifier it out:
https://github.com/abseil/googletest/blob/master/googlemock/docs/CookBook.md#using-matchers
Comme vous l'avez souligné, un défaut opérateur d'égalité (
==
) n'est pas automatiquement créé pour les types de classe (y compris les Gousses). Depuis cet opérateur est utilisé par gmock lors de l'appariement des paramètres, vous devez définir explicitement pour utiliser le type que vous le feriez pour tout autre type (voir ci-bas):Donc, la façon la plus simple de traiter ce problème est de définir un opérateur d'égalité pour la structure:
Si vous ne voulez pas aller dans cette voie, vous pouvez envisager d'utiliser des le Champ de matcher pour correspondre au paramètre basé sur les valeurs de ses variables membres. (Si un test est intéressé par la comparaison de l'égalité entre les instances de la structure, cependant, c'est une bonne indication que le code ne sera intéressé aussi bien. De sorte qu'il serait probablement utile de définir simplement un
operator==
et être fait avec elle.)Si il y a un besoin explicitement test de valeur spécifique d'un seul champ d'une structure (ou une "propriété" d'une classe), gmock a un moyen simple de tester avec le "Terrain" et la "Propriété" des définitions. Avec une structure (struct):
Ou, sinon, si nous avons SomeClass (intead de SomeStruct), qui a des variables de membre privé et public de lecture fonctions: