Blog Yazısı
JUnit 5 ve Mockito ile Test Stratejileri
Spring Boot uygulamalarında JUnit 5 ve Mockito kullanarak profesyonel birim test (unit test) ve entegrasyon testi yazma stratejilerini kod örnekleriyle öğrenin.
Sponsorlu
Spring Boot projelerinde test stratejisi yüksek coverage sayısına indirgenmemelidir. Amaç, değişiklik yapıldığında hangi davranışın bozulduğunu hızlı ve güvenilir şekilde görebilmektir. Bu nedenle unit test, slice test ve entegrasyon testlerinin görevleri ayrılmalıdır.
Unit test
Unit test framework bağımlılığını minimumda tutmalıdır. Domain servisleri, validasyon kuralları ve hesaplama fonksiyonları Spring context açmadan test edilebiliyorsa bu tercih edilmelidir. Böylece testler hızlı çalışır ve hata yeri daha net görünür.
Mockito sınırı
Mockito dış bağımlılıkları kontrol etmek için kullanılmalıdır: repository, HTTP client veya message publisher gibi. Value object, mapper veya saf domain fonksiyonlarını mocklamak testleri gereksiz kırılgan hale getirir.
Slice test
WebMvcTest ve DataJpaTest gibi slice testler belirli katmanın framework entegrasyonunu doğrular. Controller için request validation, status code ve response formatı bu seviyede test edilebilir. Tüm uygulama contextini açmaya gerek kalmaz.
Entegrasyon testi
SpringBootTest daha yavaştır ama migration, transaction sınırı, security filter zinciri veya gerçek repository davranışı için değerlidir. Testcontainers kullanmak production veritabanı davranışına daha yakın sonuç verir.
Sonuç
İyi test stratejisi doğru seviyede test yazmaktır. Hızlı unit testler, dar kapsamlı slice testler ve sınırlı ama anlamlı entegrasyon testleri birlikte kullanıldığında hem güven hem teslimat hızı korunur.
Pratik uygulama notu
Test yazarken en iyi başlangıç noktası geçmişte hata üretmiş davranışlardır. Önce fiyat hesaplama, yetki kontrolü, tarih kuralı ve dış servis hatası gibi iş açısından riskli kararlar korunmalıdır. Daha sonra controller validation ve repository sorguları eklenebilir. Böyle ilerlemek coverage sayısından daha anlamlı bir güvenlik ağı oluşturur.