Java'da Birim Test Yazmak: JUnit ve Mockito ile Kapsamlı Bir Örnek
16 Eylül 2025
Bir Java projesinde birim test yazmak için kullanabileceğiniz popüler kütüphanelerden biri JUnit 5'tir. Bunun yanında, mocklama (sahte nesne oluşturma) için ise Mockito sıkça tercih edilir.
Bir Java projesinde birim test yazmak için kullanabileceğiniz popüler kütüphanelerden biri JUnit 5'tir. Bunun yanında, mocklama (sahte nesne oluşturma) için ise Mockito sıkça tercih edilir.
İşte bu iki kütüphaneyi kullanarak nasıl bir birim test yazabileceğinize dair basit bir örnek:
Senaryo: Öğrenci Notu Hesaplama
Diyelim ki, bir öğrencinin not ortalamasını hesaplayan bir StudentService sınıfınız var. Bu servis, öğrencinin notlarını bir StudentRepository'den alıyor.
Önce, test edeceğiniz servis sınıfı:
Birim Test Sınıfı
Şimdi de bu StudentService sınıfını test edelim. Mockito kullanarak StudentRepository'i taklit edeceğiz çünkü gerçek veritabanı bağlantısı veya dosya sistemi gibi dış bağımlılıkları test esnasında kullanmak istemeyiz.
Açıklamalar
@ExtendWith(MockitoExtension.class): Bu anotasyon, JUnit 5'e testlerin Mockito tarafından yönetileceğini bildirir.
@Mock: Bu anotasyon ile, StudentRepository sınıfından bir sahte (mock) nesne oluşturulur. Bu nesne, gerçek veritabanı veya dış servise bağlanmadan taklit etmemizi sağlar.
@InjectMocks: Bu anotasyon, StudentService nesnesini oluşturur ve @Mock ile işaretlenmiş mock nesnelerini (studentRepository) bu servis içerisine otomatik olarak enjekte eder.
when(...).thenReturn(...): Bu Mockito metodu ile, mock nesnelerin belirli bir metodu çağrıldığında ne yapacağını belirtiriz. Örneğin, when(studentRepository.findStudentById(1L)) ifadesi, findStudentById metodu 1L argümanı ile çağrıldığında bir şey yapmasını istediğimizi söyler. thenReturn(...) ise o çağrının sonucunda ne döndüreceğini belirtir.
assertEquals(...): JUnit'in temel test metotlarından biridir. İlk parametrede beklenen değeri, ikinci parametrede ise gerçek değeri alır ve eşit olup olmadıklarını kontrol eder. Son parametre olan 0.0001 ise, ondalık sayılardaki hassasiyet farkını göz ardı etmek içindir.
Bu örnek, birim testlerin temel mantığını ve mocklama kavramını anlamanıza yardımcı olacaktır. İhtiyaç duyduğunuzda, bu yapıyı kendi projelerinize uyarlayabilirsiniz.
İşte bu iki kütüphaneyi kullanarak nasıl bir birim test yazabileceğinize dair basit bir örnek:
Senaryo: Öğrenci Notu Hesaplama
Diyelim ki, bir öğrencinin not ortalamasını hesaplayan bir StudentService sınıfınız var. Bu servis, öğrencinin notlarını bir StudentRepository'den alıyor.
Önce, test edeceğiniz servis sınıfı:
// Student.java
public class Student {
private String name;
private List grades;
public Student(String name, List grades) {
this.name = name;
this.grades = grades;
}
// Getter ve Setter metotları
public String getName() {
return name;
}
public List getGrades() {
return grades;
}
}
// StudentRepository.java
public interface StudentRepository {
Student findStudentById(long id);
}
// StudentService.java
public class StudentService {
private StudentRepository studentRepository;
public StudentService(StudentRepository studentRepository) {
this.studentRepository = studentRepository;
}
public double calculateAverageGrade(long studentId) {
Student student = studentRepository.findStudentById(studentId);
if (student == null || student.getGrades().isEmpty()) {
return 0.0;
}
double sum = 0.0;
for (double grade : student.getGrades()) {
sum += grade;
}
return sum / student.getGrades().size();
}
}
Birim Test Sınıfı
Şimdi de bu StudentService sınıfını test edelim. Mockito kullanarak StudentRepository'i taklit edeceğiz çünkü gerçek veritabanı bağlantısı veya dosya sistemi gibi dış bağımlılıkları test esnasında kullanmak istemeyiz.
// StudentServiceTest.java
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Arrays;
import java.util.Collections;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class StudentServiceTest {
@Mock
private StudentRepository studentRepository;
@InjectMocks
private StudentService studentService;
// Her testten önce çalışacak ayarlar
@BeforeEach
public void setup() {
// Mockito bağımlılıkları otomatik olarak enjekte eder.
// Bu yüzden burada ek bir şeye gerek yok.
}
@Test
public void testCalculateAverageGrade_ValidGrades() {
// Senaryo: Öğrencinin geçerli notları varsa ortalama doğru hesaplanmalı.
// Mock nesnenin davranışını belirliyoruz.
// studentRepository.findStudentById(1L) çağrıldığında
// yeni bir Student nesnesi döndürmesini istiyoruz.
when(studentRepository.findStudentById(1L))
.thenReturn(new Student("Ahmet", Arrays.asList(80.0, 90.0, 75.0)));
// Metodu çağırıp sonucu alıyoruz.
double average = studentService.calculateAverageGrade(1L);
// Beklenen sonuç ile elde edilen sonucu karşılaştırıyoruz.
assertEquals(81.66666666666667, average, 0.0001);
}
@Test
public void testCalculateAverageGrade_NoGrades() {
// Senaryo: Öğrencinin notu yoksa ortalama 0 olmalı.
// Mock nesnenin davranışını belirliyoruz.
when(studentRepository.findStudentById(2L))
.thenReturn(new Student("Ayşe", Collections.emptyList()));
double average = studentService.calculateAverageGrade(2L);
assertEquals(0.0, average);
}
@Test
public void testCalculateAverageGrade_StudentNotFound() {
// Senaryo: Öğrenci bulunamazsa ortalama 0 olmalı.
// Mock nesnenin davranışını belirliyoruz.
// findStudentById metodu null döndürmeli.
when(studentRepository.findStudentById(3L))
.thenReturn(null);
double average = studentService.calculateAverageGrade(3L);
assertEquals(0.0, average);
}
}
Açıklamalar
@ExtendWith(MockitoExtension.class): Bu anotasyon, JUnit 5'e testlerin Mockito tarafından yönetileceğini bildirir.
@Mock: Bu anotasyon ile, StudentRepository sınıfından bir sahte (mock) nesne oluşturulur. Bu nesne, gerçek veritabanı veya dış servise bağlanmadan taklit etmemizi sağlar.
@InjectMocks: Bu anotasyon, StudentService nesnesini oluşturur ve @Mock ile işaretlenmiş mock nesnelerini (studentRepository) bu servis içerisine otomatik olarak enjekte eder.
when(...).thenReturn(...): Bu Mockito metodu ile, mock nesnelerin belirli bir metodu çağrıldığında ne yapacağını belirtiriz. Örneğin, when(studentRepository.findStudentById(1L)) ifadesi, findStudentById metodu 1L argümanı ile çağrıldığında bir şey yapmasını istediğimizi söyler. thenReturn(...) ise o çağrının sonucunda ne döndüreceğini belirtir.
assertEquals(...): JUnit'in temel test metotlarından biridir. İlk parametrede beklenen değeri, ikinci parametrede ise gerçek değeri alır ve eşit olup olmadıklarını kontrol eder. Son parametre olan 0.0001 ise, ondalık sayılardaki hassasiyet farkını göz ardı etmek içindir.
Bu örnek, birim testlerin temel mantığını ve mocklama kavramını anlamanıza yardımcı olacaktır. İhtiyaç duyduğunuzda, bu yapıyı kendi projelerinize uyarlayabilirsiniz.
Yazar: Mert Akbağ
Bu yazıyı beğendiniz mi?
Yazılım testi hakkında daha fazla içerik için blog sayfamı ziyaret edin veya benimle iletişime geçin.