Mocking dengan GMock
Mock dependensi
Mocking dengan GMock adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Mengapa Menggunakan Mock?
GMock membuat objek semu yang mencatat pemanggilan dan mengembalikan hasil yang telah diprogram. Mocking mengisolasi unit yang diuji dari dependensi yang lambat atau tidak dapat diprediksi, seperti basis data atau jaringan.
Memulai dengan Antarmuka
Dependensi yang dapat di-mock biasanya berupa kelas dasar abstrak dengan metode virtual.
#include <string>
class Database {
public:
virtual ~Database() = default;
virtual std::string get(int id) = 0;
virtual bool save(const std::string& v) = 0;
};Mendefinisikan Kelas Mock
Gunakan MOCK_METHOD untuk membuat mock bagi setiap metode virtual, dengan menentukan tipe pengembalian, nama, argumen, dan kualifikator.
#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));
};Menetapkan Ekspektasi
EXPECT_CALL menyatakan bagaimana metode mock harus dipanggil dan apa yang dikembalikannya. WillOnce(Return(...)) memprogram hasilnya.
#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");
}Pencocok Argumen
Ekspektasi dapat mencocokkan argumen secara longgar dengan pencocok seperti _ (apa saja), Gt(5), atau 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");
}Kardinalitas
Tentukan berapa kali suatu pemanggilan diharapkan terjadi dengan Times.
Times(1)tepat satu kaliTimes(AtLeast(2))Times(0)tidak boleh pernah dipanggil
#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);
}Aksi Pengembalian
Aksi menentukan perilaku.
Return(value)ReturnRef(ref)Throw(exception)Invoke(callable)untuk menjalankan kode khusus
Menyuntikkan Objek Tiruan
Unit yang diuji harus menerima dependensi melalui pointer atau referensi ke antarmuka. Inilah injeksi dependensi, yang memungkinkan pembuatan objek tiruan.
#include <string>
class Database;
class UserService {
Database& db;
public:
UserService(Database& d) : db(d) {}
std::string name(int id);
};Memverifikasi Interaksi
GMock memverifikasi semua ekspektasi EXPECT_CALL ketika objek tiruan dihancurkan. Ekspektasi yang tidak terpenuhi (jumlahnya salah atau pemanggilannya tidak ada) otomatis membuat pengujian gagal.
Objek Tiruan Ramah, Ketat, dan Cerewet
Kontrol cara penanganan pemanggilan yang tidak terduga.
NiceMock: mengabaikan pemanggilan yang tidak pentingStrictMock: setiap pemanggilan yang tidak terduga menyebabkan kegagalan- Bawaan (cerewet): memberikan peringatan untuk pemanggilan yang tidak penting
Buat Objek Tiruan Hanya untuk Antarmuka Milik Anda
Sebaiknya Anda membuat objek tiruan untuk antarmuka milik Anda sendiri, bukan kelas konkret pihak ketiga. Perkenalkan antarmuka pembungkus tipis di sekitar pustaka eksternal agar pengujian tetap stabil.
Pemeriksaan Cepat
Ingat kembali kapan GMock memeriksa ekspektasi.
Rangkuman
Anda telah mempelajari GMock.
- Buat objek tiruan untuk antarmuka virtual dengan
MOCK_METHOD EXPECT_CALL+ aksi memprogram perilaku- Pencocok dan
Timesmengatur argumen serta kardinalitas - Suntikkan objek tiruan; ekspektasi diverifikasi saat objek dihancurkan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mocking dengan GMock” gratis?
Ya — teks lengkap “Mocking dengan GMock” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mocking dengan GMock”?
Mock dependensi Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Mocking dengan GMock” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menyiapkan GTest
- Assertion dan Matcher
- Fixture dan Penyiapan
- Mocking dengan GMock