0Pricing
C++ Academy · Pelajaran

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 kali
  • Times(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 penting
  • StrictMock: 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 Times mengatur 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

  1. Menyiapkan GTest
  2. Assertion dan Matcher
  3. Fixture dan Penyiapan
  4. Mocking dengan GMock
← Kembali ke C++ Academy