Simulations avec GMock
Simuler les dépendances
Simulations avec GMock est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Pourquoi utiliser des mocks ?
GMock crée de faux objets qui enregistrent les appels et renvoient des résultats programmés. Les mocks isolent l’unité testée de dépendances lentes ou imprévisibles comme les bases de données ou les réseaux.
Commencer par une interface
Les dépendances faciles à simuler sont généralement des classes de base abstraites comportant des méthodes virtuelles.
#include <string>
class Database {
public:
virtual ~Database() = default;
virtual std::string get(int id) = 0;
virtual bool save(const std::string& v) = 0;
};Définir une classe mock
Utilisez MOCK_METHOD pour générer un mock pour chaque méthode virtuelle, en indiquant le type de retour, le nom, les arguments et les qualificatifs.
#include <gmock/gmock.h>
#include <string>
class Database {
public:
virtual ~Database() = default;
virtual std::string get(int id) = 0;
};
class MockDatabase : public Database {
public:
MOCK_METHOD(std::string, get, (int id), (override));
};Définir les attentes
EXPECT_CALL indique comment une méthode mock doit être appelée et ce qu’elle doit renvoyer. WillOnce(Return(...)) programme le résultat.
#include <gmock/gmock.h>
using ::testing::Return;
TEST(DbTest, ReturnsValue) {
MockDatabase db;
EXPECT_CALL(db, get(1)).WillOnce(Return("alice"));
EXPECT_EQ(db.get(1), "alice");
}Correspondance des arguments
Les attentes peuvent faire correspondre les arguments de manière souple avec des comparateurs comme _ (n'importe lequel), Gt(5) ou HasSubstr("x").
#include <gmock/gmock.h>
using ::testing::_;
using ::testing::Return;
TEST(DbTest, AnyId) {
MockDatabase db;
EXPECT_CALL(db, get(_)).WillRepeatedly(Return("x"));
EXPECT_EQ(db.get(99), "x");
}Cardinalité
Précisez combien de fois un appel est attendu avec Times.
Times(1)exactement une foisTimes(AtLeast(2))Times(0)ne doit jamais être appelé
#include <gmock/gmock.h>
using ::testing::AtLeast;
using ::testing::Return;
TEST(DbTest, CalledTwice) {
MockDatabase db;
EXPECT_CALL(db, get(1)).Times(AtLeast(2)).WillRepeatedly(Return("v"));
db.get(1);
db.get(1);
}Actions de retour
Les actions déterminent le comportement.
Return(value)ReturnRef(ref)Throw(exception)Invoke(callable)pour exécuter du code personnalisé
Injection du simulacre
L'unité testée doit accepter la dépendance par l'intermédiaire d'un pointeur ou d'une référence vers l'interface. C'est l'injection de dépendances, qui rend la simulation possible.
#include <string>
class Database;
class UserService {
Database& db;
public:
UserService(Database& d) : db(d) {}
std::string name(int id);
};Vérification des interactions
GMock vérifie toutes les attentes EXPECT_CALL lorsque le simulacre est détruit. Les attentes non satisfaites (nombre incorrect ou appels manquants) font automatiquement échouer le test.
Simulacres tolérants, stricts ou insistants
Contrôlez la manière dont les appels inattendus sont traités.
NiceMock: ignore les appels sans intérêtStrictMock: tout appel inattendu fait échouer le test- Par défaut (insistant) : avertit en cas d'appels sans intérêt
Simulez uniquement ce que vous contrôlez
Préférez simuler vos propres interfaces plutôt que des classes concrètes tierces. Introduisez de fines interfaces d'encapsulation autour des bibliothèques externes afin que les tests restent stables.
Vérification rapide
Rappelez-vous quand GMock vérifie les attentes.
Récapitulatif
Vous avez découvert GMock.
- Simulez les interfaces virtuelles avec
MOCK_METHOD EXPECT_CALLet les actions programment le comportement- Les comparateurs et
Timescontrôlent les arguments et la cardinalité - Injectez les simulacres ; les attentes sont vérifiées lors de la destruction
Questions Fréquemment Posées
La leçon « Simulations avec GMock » est-elle gratuite ?
Oui — le texte complet de « Simulations avec GMock » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Simulations avec GMock » ?
Simuler les dépendances Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Simulations avec GMock » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Configurer GTest
- Assertions et correspondants
- Fixtures et configuration
- Simulations avec GMock