CodeBlanks Logo Icon CodeBlanks

Mock

GoogleMock ile sahte nesne kullanmayı öğrenirsin.

GoogleMock nedir?

GoogleMock (gmock), GoogleTest'le birlikte gelen bir sahte nesne (mock) çerçevesidir. Gerçek bir bağımlılığı (veritabanı, ağ, dosya) taklit eden mock sınıfları yazmanı sağlar. Böylece testleri yavaş ya da kırılgan bağımlılıklardan ayırırsın.

Bir mock sınıfı, sahte davranacağı arayüzden (interface) miras alır. MOCK_METHOD makrosu her sanal metot için bir sahte uyarlama oluşturur. EXPECT_CALL(mock, metot(...)) ile çağrı beklentisi ve dönüş değeri belirlenir. Örnek: bir Database arayüzünün get metodunu mock'lamak, testte gerçek veritabanı olmadan davranışı denetlemeyi sağlar.

Mock sınıfı yazımı

Bir mock sınıfı yazmak için önce gerçek arayüzü tanımlarsın (saf sanal metotlarla). Sonra mock sınıfı bu arayüzden miras alır ve her metot için MOCK_METHOD çağırır. MOCK_METHOD dört parça alır: dönüş türü, metot adı, bağımsız değişken listesi (parantez içinde), niteleyiciler (override).

Örnek: class MockDatabase : public Database { public: MOCK_METHOD(int, get, (const std::string& key), (override)); };. Burada get metodu mock'lanır. Testte MockDatabase db; oluşturup EXPECT_CALL(db, get("id")).WillOnce(Return(42)); ile beklenti kurarsın. Böylece db.get("id") çağrısı 42 döndürür; gerçek veritabanı gerekmez.

Uygulama MockDatabase yaz

Database arayüzünü tanımla: virtual ~Database() = default; ve virtual int get(const std::string& key) = 0;. MockDatabase sınıfını Database'den türet ve MOCK_METHOD(int, get, (const std::string& key), (override)); çağır. main içinde std::cout << "test: hazır"; yaz.

Başlangıç kodu

main.cpp
#include <iostream>
#include <gtest/gtest.h>
#include <string>

// Database arayüzünü tanımla
// MockDatabase sınıfını ve MOCK_METHOD'u ekle

int main(int argc, char** argv) {
    std::cout << "test: hazır";
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <gtest/gtest.h>
#include <string>

class Database {
public:
    virtual ~Database() = default;
    virtual int get(const std::string& key) = 0;
};

class MockDatabase : public Database {
public:
    MOCK_METHOD(int, get, (const std::string& key), (override));
};

int main(int argc, char** argv) {
    std::cout << "test: hazır";
    return 0;
}

Beklenen çıktı

test: hazır

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 MOCK_METHOD makrosunu tamamla

Soru
____(int, get, (const std::string& key), (override));
Cevap
MOCK_METHOD(int, get, (const std::string& key), (override));

Açıklama: MOCK_METHOD bir sanal metodun sahte uyarlamasını oluşturur.

2 Parçayı rolüne eşle

Kavram Anlamı
MOCK_METHOD Sahte metot oluşturur
EXPECT_CALL Çağrı beklentisi kurar
class MockDatabase Sahte sınıf
WillOnce(Return(42)) Dönüş değeri belirler

3 EXPECT_CALL ne yapar?

  • Mock metot çağrısına beklenti kurar Doğru cevap
  • Testi hemen durdurur
  • Yeni mock sınıf oluşturur
  • Çıktıyı renklendirir

Açıklama: EXPECT_CALL, mock metodun nasıl çağrılacağını ve ne döndüreceğini belirler.

İleri seviye bölümündeki tüm dersler