Java'da Teste Giriş
Maria Milusheva
Senior Software Engineer
Önceki derste ve alıştırmalarında, dönen değerlere göre test ettik.
Peki ya dönüş değeri yoksa?
Ya dönüş değerleri önemli ya da bilgilendirici değilse?
Örnek: veritabanına kaydetme.

Veritabanı - düzenli veri koleksiyonlarını depolamak, yönetmek ve güvence altına almak için dijital depo. Birçok veritabanı sağlayıcısı vardır:

Veritabanı sunucuları dayanıklı, güvenli, güvenilir ve neredeyse sınırsız kapasiteli
Gerçek veritabanları birim testleri için çok büyük ve karmaşıktır (entegrasyon testlerinde kullanılabilir)
Günlükleri işlediğimizi varsayalım:
public class MessageProcessor {
private InfoStore infoStore; // Bilgi log iletilerini burada saklayacak
private ErrorStore errorStore; // Hata log iletilerini burada saklayacak
public void saveMessage(String message) {
if (message.startsWith("[INFO]")) {
infoStore.save(message);
}
if (message.startsWith("[ERROR]")) {
errorStore.save(message);
}
}
}
Testin çalışması için yalnızca temel arayüzler gerekir:
// InfoStore ve ErrorStore için taslaklar
// Mock’lar, sahte sınıfların tam uygulanmasına ihtiyaç duymaz
interface InfoStore {
void save(String message);
}
interface ErrorStore {
void save(String message);
}
Herhangi bir veritabanı oluşturmadan bir iletinin kaydedildiğini nasıl test ederiz?
Bir mock’un kullanıldığını doğrulayın:
import static org.mockito.Mockito.verify;
Bir mock’un kullanılmadığını doğrulayın:
import static org.mockito.Mockito.verifyNoInteractions;
@Test void process_savesToInfoStore_whenInfoMessage() { InfoStore infoStore = mock(InfoStore.class); ErrorStore errorStore = mock(ErrorStore.class); MessageProcessor messageProcessor = new MessageProcessor(infoStore, errorStore);String message = "[INFO] Process started."; messageProcessor.saveMessage(message); // Will use either InfoStore or ErrorStore// İki veritabanından hangisinin kullanıldığını doğrulayın verify(infoStore).save(message); verifyNoInteractions(errorStore); }
Oluşturduğumuz ileti bunun yerine şöyle olursa ne olur:
String message = "[ERROR] Process failed!"
O zaman şu tür test hataları görürüz:
Wanted but not invoked:
infoStore.save("[ERROR] Process failed!");
Actually, there were zero interactions with this mock.
Bir log’un kaç kez çağrıldığını tam olarak doğrulayabiliriz:
import static org.mockito.Mockito.times;
List<String> messages = new ArrayList<>(); // Liste oluşturun ve öğeler ekleyin messages.add("[INFO] Processing data..."); messages.add("[INFO] Processing data..."); messages.add("[INFO] Processing data..."); messageProcessor.saveMessageList(messages); // Üç iletiyi kaydedinverify(infoStore, times(3)).save("[INFO] Processing data...");
Java'da Teste Giriş