CodeBlanks Logo Icon CodeBlanks

@Mock

@Mock ile mock enjeksiyonunu öğrenirsin.

@Mock

@Mock annotation'ı, bir alanı mock olarak işaretler. Bu, mock() çağrısı yapmaktan daha kısa bir yoldur. Mock'ların başlatılması için MockitoAnnotations.openMocks(this) çağrılır.

class UserServiceTest {
    @Mock UserRepository repo;
    @Mock MailService mail;

    @BeforeEach
    void setup() {
        MockitoAnnotations.openMocks(this);
    }
}

Çok sayıda mock gerektiğinde bu yöntem daha okunabilirdir. Field tanımı ile mock türleri tek bakışta görünür. Bu, modern Mockito kullanımının önerilen yoludur.

@InjectMocks

@InjectMocks, mock'ları test edilen sınıfa otomatik olarak enjekte eder. Kurucu, setter veya alan enjeksiyonu deneyerek bağımlılıkları yerleştirir.

@InjectMocks UserService service;

// service, yukarıdaki @Mock repo ve mail ile enjekte edilir

Bu, elle new UserService(repo, mail) yazmaktan kurtarır. Sınıfın bağımlılık yapısı değişse bile test güncellenmez. Bu, temiz test kodu için önemli bir kolaylıktır.

Uygulama UserService ve bağımlılıklarını kur

Bir Logger arayüzü tanımla (void log(String msg)). UserService sınıfı tanımla; kurucu Logger logger alsın ve greet(String name) yöntemi logger.log("Hello " + name) çağrısı yapsın. Bir InjectDemo sınıfında main metodu yaz; Logger için basit bir uygulama (Anonymous sınıf ya da lambda yerine somut sınıf) yaz, new UserService(logger) ile hızmeti oluştur ve greet("Ayşe") çağır.

Başlangıç kodu

Main.java
// Logger arayüzünü tanımla (log yöntemi)

// Logger'ın somut uygulamasını tanımla

// UserService sınıfını tanımla (kurucu Logger alsın, greet yöntemi olsun)

// InjectDemo sınıfında main yaz ve greet çağrısının çıktısını yazdır

Örnek çözüm

Main.java
interface Logger {
    void log(String msg);
}

class ConsoleLogger implements Logger {
    public void log(String msg) {
        System.out.println(msg);
    }
}

class UserService {
    Logger logger;
    UserService(Logger logger) { this.logger = logger; }
    void greet(String name) {
        logger.log("Hello " + name);
    }
}

class InjectDemo {
    public static void main(String[] args) {
        UserService s = new UserService(new ConsoleLogger());
        s.greet("Ayşe");
    }
}

Beklenen çıktı

Hello Ayşe

Soru ve cevaplar

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

1 Mock annotation'ını tamamla

Soru
class UserServiceTest {
    ____ UserRepository repo;
    @Mock MailService mail;
}
Cevap
class UserServiceTest {
    @Mock UserRepository repo;
    @Mock MailService mail;
}

Açıklama: @Mock ile alan mock olarak işaretlenir.

2 @InjectMocks ne yapar?

  • Mock oluşturur
  • Mock'ları test edilen sınıfa enjekte eder Doğru cevap
  • Test raporu üretir
  • Test çalıştırır

Açıklama: @InjectMocks, mock'ları test edilen sınıfa otomatik enjekte eder.

3 Mockito annotation'larını eşleştir

Kavram Anlamı
@Mock Sahte nesne alanı
@InjectMocks Mock'ları sınıfa enjekte eder
@Spy Gerçek nesneyi sarmalar
@Captor Argüman yakalayıcı

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