Mock
- C++ kursu
- İleri seviye
- Ders 41/83
- 5 dk
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
#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
#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
____(int, get, (const std::string& key), (override));
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.