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