Introductie tot testen in Java
Maria Milusheva
Senior Software Engineer
Herinner de afhankelijkheidsstroom uit de vorige les: De valuta-app hangt af van de bankserver:

Berekeningen zijn niet verifieerbaar omdat wisselkoersen per definitie onvoorspelbaar zijn.
Mocking: gesimuleerde objecten of gedrag maken voor echte objecten die lastig zijn in tests, zodat we kunnen testen zonder externe afhankelijkheden.
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Kijk naar de vorige les:
public double convertEuroTo(String currency, double amount) {
double rate = this.bank.getRateEuroTo(currency);
return amount * rate;
}
➡ Maak voor tests een voorspelbaar object voor EuropeanCentralBankServer
Zo testen we met mocks:
@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);// Roept getRateEuroTo aan op de mock en krijgt onze voorgeprogrammeerde waarde double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // We kunnen nu exact op retourwaarden asserten }
Vergeet nooit je mocks te programmeren:
@Test
void convert_returnsExpectedValue() {
EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// Geen mock-programmering - de mock weet niet hoe te reageren op getRateEuroTo
double result = exchangeApp.convertEuroTo("USD", 1000);
assertEquals(1100, result); // Faalt door ontbrekende mock-setup
}
De test faalt met:
org.opentest4j.AssertionFailedError:
Expected :1100.0
Actual :0.0
Een mock programmeren heet stubbing.
Stubbing: minimale, vooraf gedefinieerde antwoorden geven op aanroepen tijdens de test, en verder niet reageren op iets buiten wat voor de test is ingesteld.
Mockito kan ook foutscenario’s simuleren:
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
Introductie tot testen in Java