Verifikasi dalam mocking

Pengantar Pengujian di Java

Maria Milusheva

Senior Software Engineer

Motivasi: Tanpa nilai balik

Pada pelajaran sebelumnya dan latihannya, kita menguji dengan menegaskan nilai balik.

  • Namun bagaimana jika tidak ada nilai balik?

  • Bagaimana jika nilai balik tidak penting atau tidak informatif?

Contoh: menyimpan ke database.

Grafik database dengan berkas yang disimpan di dalamnya

Pengantar Pengujian di Java

Contoh: Database

Database: repositori digital untuk menyimpan, mengelola, dan mengamankan kumpulan data terstruktur. Banyak penyedia database: Logo beberapa database populer

  • Server database itu tahan lama, aman, andal, dan kapasitasnya tinggi

  • Database nyata terlalu besar dan kompleks untuk unit test (namun bisa dipakai di integration test)

Pengantar Pengujian di Java

Contoh: Pesan log

Misalkan kita memproses log:

public class MessageProcessor {
    private InfoStore infoStore;  // Will store info log messages here
    private ErrorStore errorStore; // Will store error log messages here

    public void saveMessage(String message) {
        if (message.startsWith("[INFO]")) {
            infoStore.save(message);
        }
        if (message.startsWith("[ERROR]")) {
            errorStore.save(message);
        }
    }
}
Pengantar Pengujian di Java

InfoStore dan ErrorStore

Untuk tes, kita hanya butuh antarmuka dasar:

// Blueprints for InfoStore and ErrorStore
// Mocks don't need the mocked classes to be properly implemented
interface InfoStore {
    void save(String message);
}

interface ErrorStore {
    void save(String message);
}
Pengantar Pengujian di Java

Mockito verify

Bagaimana menguji pesan tersimpan tanpa membuat database?

Tegaskan mock digunakan:

import static org.mockito.Mockito.verify;

Tegaskan mock tidak digunakan:

import static org.mockito.Mockito.verifyNoInteractions;
Pengantar Pengujian di Java

Penyiapan pengujian

@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
// Verify which one of the two databases was used verify(infoStore).save(message); verifyNoInteractions(errorStore); }
Pengantar Pengujian di Java

Pesan kegagalan tes

Bagaimana jika pesan yang kita buat adalah:

String message = "[ERROR] Process failed!"

Maka kita akan melihat kegagalan tes seperti ini:

Wanted but not invoked:
infoStore.save("[ERROR] Process failed!");
Actually, there were zero interactions with this mock.
Pengantar Pengujian di Java

Trik verifikasi lanjutan

Kita dapat memverifikasi berapa kali log dipanggil:

import static org.mockito.Mockito.times;
List<String> messages = new ArrayList<>(); // Create list and add elements
                messages.add("[INFO] Processing data...");
                messages.add("[INFO] Processing data...");
                messages.add("[INFO] Processing data...");

messageProcessor.saveMessageList(messages); // Save the three messages


verify(infoStore, times(3)).save("[INFO] Processing data...");

DNT_CURLLY_TAG_3

Pengantar Pengujian di Java

Ayo berlatih!

Pengantar Pengujian di Java

Preparing Video For Download...