Mock’ta doğrulama

Java'da Teste Giriş

Maria Milusheva

Senior Software Engineer

Güdü: Dönüş değeri yok

Ö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.

Dosyaların içine kaydedildiği bir veritabanı grafiği

Java'da Teste Giriş

Örnek: Veritabanları

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: Bazı popüler veritabanlarının logoları

  • 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)

Java'da Teste Giriş

Örnek: Log iletileri

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);
        }
    }
}
Java'da Teste Giriş

InfoStore ve ErrorStore

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);
}
Java'da Teste Giriş

Mockito verify

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;
Java'da Teste Giriş

Test kurulumu

@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); }
Java'da Teste Giriş

Test hata iletileri

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.
Java'da Teste Giriş

Ek doğrulama ipuçları

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 kaydedin


verify(infoStore, times(3)).save("[INFO] Processing data...");
Java'da Teste Giriş

Hadi pratik yapalım!

Java'da Teste Giriş

Preparing Video For Download...