Birim Testlerinde Mock ve Stub

Java'da Teste Giriş

Maria Milusheva

Senior Software Engineer

Güdü: Bağımlılıklar

Önceki derideki bağımlılık akışını anımsayın: Döviz kuru uygulaması banka sunucusuna bağımlıdır: Bankacılık demosunda bağımlılık akışının bir Mermaid grafiği

Hesaplamalar doğrulanamaz çünkü döviz kurları doğası gereği öngörülemez.

Java'da Teste Giriş

Testte bağımlılık yönetimi

Mocking – testlerde kullanması güç gerçek nesneler yerine benzetilmiş nesneler/davranışlar oluşturarak, dış bağımlılıklara güvenmeden test etmeyi sağlar.


import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Mock örneği

Java'da Teste Giriş

Mocking

  • Mock = sadece test açısından gerçek nesneyi taklit eden yedek oyuncu gibidir

Önceki dersi düşünün:

public double convertEuroTo(String currency, double amount) {
    double rate = this.bank.getRateEuroTo(currency);
    return amount * rate;
}

➡ Test için EuropeanCentralBankServer için öngörülebilir bir nesne oluşturun

Java'da Teste Giriş

Mocking: Döviz çevirme

Mock’larla test böyle yapılır:

@Test
void convert_returnsExpectedValue() {
    EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
    ExchangeApp exchangeApp = new ExchangeApp(bank);

// Mock’u çalışacak şekilde programlamalıyız when(bank.getRateEuroTo("USD")).thenReturn(1.1);
// Mock nesneden getRateEuroTo çağrılır; önceden programlanan değerleri döner double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // Artık kesin dönüş değerlerini doğrulayabiliriz }
Java'da Teste Giriş

Yaygın hata

Mock’ları programlamayı asla unutmayın:

@Test
void convert_returnsExpectedValue() {
    EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
    ExchangeApp exchangeApp = new ExchangeApp(bank);

    // Mock programlanmadı – mock banka nesnesi getRateEuroTo’ya nasıl yanıt vereceğini bilmiyor
    double result = exchangeApp.convertEuroTo("USD", 1000);

    assertEquals(1100, result); // Mock kurulmadığı için başarısız olur
}
Java'da Teste Giriş

Stub’lama

Test şu hatayla başarısız oluyor:

org.opentest4j.AssertionFailedError: 
Expected :1100.0
Actual   :0.0

Bir mock’u programlamaya stub’lama denir.

Stub’lama – test sırasında yapılan çağrılara önceden tanımlı, en az düzeyde yanıtlar verme; testte programlananların dışına genelde hiç yanıt vermeme.

Java'da Teste Giriş

Mockito ile İstisnalar

Mockito hata senaryolarını da taklit edebilir:

EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// thenReturn() yerine thenThrow() kullanın
when(bank.getRateEuroTo("USD"))
        .thenThrow(new RuntimeException("Bank server unavailable."));

exchangeApp.convertEuroTo("USD", 1000); // getRateEuroTo istisna fırlatır
Java'da Teste Giriş

Hadi pratik yapalım!

Java'da Teste Giriş

Preparing Video For Download...