EMZETT.
Giriş yap

JUnit 5 ve Mockito: Java testleri yazmak

Kısaca: JUnit 5 Java için otomatik testler çalıştırır, Mockito bağımlılıkları kukla nesnelerle (mock) değiştirir; böylece tek tek sınıflar yalıtılmış ve hızlı biçimde denetlenebilir.

Biraz daha ayrıntılı: Birim testleri küçük birimleri (metotlar/sınıflar) otomatik olarak denetler. Hataları erken yakalar, yeniden düzenlemeyi kolaylaştırır ve istenen davranışı belgeler. Java’da JUnit standarttır.

Ayrıntılı

İlk test

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class DiscountTest {
    @Test
    void tenPercentOfHundred() {
        assertEquals(90.0, Discount.apply(100.0, 10), 0.001);
    }
    @Test
    void negativePercentThrows() {
        assertThrows(IllegalArgumentException.class, () -> Discount.apply(100.0, -5));
    }
}

Çalıştır: mvn test / ./gradlew test / IDE. Yapı: düzenle – uygula – doğrula (arrange – act – assert). Ek açıklamalar: @Test, @BeforeEach, @AfterEach, @BeforeAll, @DisplayName, @Disabled, @Nested, @ValueSource/@CsvSource ile @ParameterizedTest. Doğrulamalar: assertEquals, assertTrue, assertNull, assertAll, assertThrows.

Mockito: kuklalar

Bir sınıf bir veri tabanına, postaya veya web API’sine ihtiyaç duyuyorsa onu testte değiştirirsin:

import static org.mockito.Mockito.*;
@Test
void orderSendsMail() {
    MailService mail = mock(MailService.class);
    PriceService prices = mock(PriceService.class);
    when(prices.price("A1")).thenReturn(20.0);
    var service = new OrderService(mail, prices);
    service.order("A1", "customer@example.org");
    verify(mail).send(eq("customer@example.org"), contains("20"));
    verifyNoMoreInteractions(mail);
}

when(...).thenReturn, verify(...), ArgumentCaptor, spy, MockitoExtension ile @Mock/@InjectMocks. Bağımlılık enjeksiyonu (yapıcıdan geçirme) sınıfları test edilebilir kılar.

İyi testler

  • Küçük, hızlı, bağımsız, tekrarlanabilir (F.I.R.S.T.), test başına bir davranış, anlamlı adlar.
  • Uç durumlar: boş, null, sınır değerleri, hata durumları.
  • Uygulamayı değil davranışı test et; her şeyi mock’lama (değer nesnelerini doğrudan kullan).
  • Zamanı/rastgeleliği enjekte et (Clock).
  • Test piramidi: çok birim testi, daha az entegrasyon testi, az uçtan uca test; gerçek veri tabanı testleri için Testcontainers.
  • Kapsama (JaCoCo) bir ipucu, hedef değil; mutasyon testi (PIT).
  • TDD: önce test (kırmızı), sonra kod (yeşil), sonra düzenle.

Uygulama ve sınav

  • CI her push’ta testleri çalıştırır; başarısız testler birleştirmeyi engeller.
  • Sorun giderme: bir test hatayı düzeltmeden önce yeniden üretir (regresyon testi).
  • Spring Boot: @SpringBootTest, @WebMvcTest, MockMvc (bkz. Spring).
  • Tipik hatalar: testler birbirine bağlı, gerçek ağ/dosya erişimi, Thread.sleep, kararsız testler (zaman/sıra).
  • IHK projesi: test kavramını/test günlüğünü (test senaryoları, beklenen/gerçek sonuç) izlenebilir biçimde belgele.
  • İlgili: pytest (Python), Jest/Vitest (JS), test türlerine genel bakış.

Ayrıca bak: Test türlerine genel bakış, Test odaklı geliştirme, Maven ve Gradle, Jest ve Vitest