Mockování a stubbing v unit testech

Úvod do testování v Javě

Maria Milusheva

Senior Software Engineer

Motivace: závislosti

Z předchozí lekce: aplikace pro směnu měn závisí na bankovním serveru: Mermaid diagram závislostí v bankovním příkladu

Výsledky nelze ověřit, protože kurzy měn jsou ze své podstaty nepředvídatelné.

Úvod do testování v Javě

Správa závislostí v testech

Mockování – vytváření simulovaných objektů nebo chování místo reálných objektů, které jsou v testech těžko použitelné; umožňuje testovat bez externích závislostí.


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

Příklad mockování

Úvod do testování v Javě

Mockování

  • Mock = jako náhradní herec ve hře – předstírá, že je skutečným objektem, ale pouze v rozsahu testu

Z předchozí lekce:

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

➡ Vytvořte předvídatelný objekt pro EuropeanCentralBankServer pro testování

Úvod do testování v Javě

Mockování: směna měn

Takto testujeme s mocky:

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

// Need to program the mock so it works when(bank.getRateEuroTo("USD")).thenReturn(1.1);
// Calls getRateEuroTo from the mock object, obtaining our pre-programmed values double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // We can now assert on exact return values }
Úvod do testování v Javě

Častá chyba

Nesmíme zapomenout nastavit chování mocku:

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

    // No mock programming - mock bank object doesn't know how to respond to getRateEuroTo
    double result = exchangeApp.convertEuroTo("USD", 1000);

    assertEquals(1100, result); // Will fail due to lack of mock setup
}
Úvod do testování v Javě

Stubbing

Test selže s chybou:

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

Nastavení chování mocku se nazývá stubbing.

Stubbing – poskytování předem definovaných odpovědí na volání během testu; na vše ostatní mock nereaguje.

Úvod do testování v Javě

Výjimky s Mockito

Mockito umí také simulovat chybové scénáře:

EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// Instead of thenReturn() use thenThrow()
when(bank.getRateEuroTo("USD"))
        .thenThrow(new RuntimeException("Bank server unavailable."));

exchangeApp.convertEuroTo("USD", 1000); // getRateEuroTo will throw exception
Úvod do testování v Javě

Pojďme si procvičit!

Úvod do testování v Javě

Preparing Video For Download...