Java'da Teste Giriş
Maria Milusheva
Senior Software Engineer
Önceki derideki bağımlılık akışını anımsayın: Döviz kuru uygulaması banka sunucusuna bağımlıdır:

Hesaplamalar doğrulanamaz çünkü döviz kurları doğası gereği öngörülemez.
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;

Ö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
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 }
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
}
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.
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ş