Mocking dan Stubbing dalam Unit Test

Pengantar Pengujian di Java

Maria Milusheva

Senior Software Engineer

Motivasi: Dependensi

Ingat alur dependensi pada pelajaran sebelumnya: Aplikasi konversi mata uang bergantung pada server bank: Grafik Mermaid tentang alur dependensi di demo perbankan

Perhitungan tak bisa diverifikasi karena kurs valas tidak dapat diprediksi.

Pengantar Pengujian di Java

Manajemen dependensi dalam pengujian

Mocking: membuat objek atau perilaku tiruan untuk objek nyata yang sulit dipakai dalam tes, sehingga kita bisa menguji tanpa bergantung pada dependensi eksternal.


import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Contoh mocking

Pengantar Pengujian di Java

Mocking

  • Mock = seperti pemeran pengganti yang bertindak sebagai objek asli hanya sebatas kebutuhan tes

Pertimbangkan pelajaran sebelumnya:

public double convertEuroTo(String currency, double amount) {
    double rate = this.bank.getRateEuroTo(currency);
    return amount * rate;
}

➡ Buat objek EuropeanCentralBankServer yang dapat diprediksi untuk pengujian

Pengantar Pengujian di Java

Mocking: Konversi mata uang

Begini cara menguji dengan mock:

@Test
void convert_returnsExpectedValue() {
    EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
    ExchangeApp exchangeApp = new ExchangeApp(bank);

// Perlu memprogram mock agar bisa bekerja when(bank.getRateEuroTo("USD")).thenReturn(1.1);
// Memanggil getRateEuroTo dari objek mock, menggunakan nilai yang sudah diprogram double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // Sekarang kita bisa asert nilai pasti }
Pengantar Pengujian di Java

Kesalahan umum

Jangan lupa memprogram mock kita:

@Test
void convert_returnsExpectedValue() {
    EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
    ExchangeApp exchangeApp = new ExchangeApp(bank);

    // Tidak ada pemrograman mock - objek mock bank tidak tahu cara merespons getRateEuroTo
    double result = exchangeApp.convertEuroTo("USD", 1000);

    assertEquals(1100, result); // Akan gagal karena setup mock kurang
}
Pengantar Pengujian di Java

Stubbing

Tes gagal dengan:

org.opentest4j.AssertionFailedError: 
Expected :1100.0
Actual   :0.0

Memprogram mock disebut stubbing.

Stubbing: memberi jawaban minimal dan terdefinisi untuk panggilan selama tes, dan biasanya tidak merespons hal lain di luar yang diprogram untuk tes.

Pengantar Pengujian di Java

Exception dengan Mockito

Mockito juga bisa mensimulasikan skenario error:

EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// Alih-alih thenReturn() gunakan thenThrow()
when(bank.getRateEuroTo("USD"))
        .thenThrow(new RuntimeException("Bank server unavailable."));

exchangeApp.convertEuroTo("USD", 1000); // getRateEuroTo akan melempar exception
Pengantar Pengujian di Java

Ayo berlatih!

Pengantar Pengujian di Java

Preparing Video For Download...