Introduzione al Testing in Java
Maria Milusheva
Senior Software Engineer
Ricorda il flusso di dipendenze della lezione precedente: l’app di cambio valuta dipende dal server bancario:

Impossibile verificare i calcoli perché i tassi di cambio sono intrinsecamente imprevedibili.
Mocking: creare oggetti o comportamenti simulati per oggetti reali difficili da usare nei test, così da testare senza dipendere da risorse esterne.
Mockito: potente libreria Java per creare mock.
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Riprendiamo la lezione precedente:
public double convertEuroTo(String currency, double amount) {
double rate = this.bank.getRateEuroTo(currency);
return amount * rate;
}
➡ Crea un oggetto prevedibile di EuropeanCentralBankServer per i test
Ecco come testare con i mock:
@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);// Chiama getRateEuroTo dal mock, ottenendo il valore preimpostato double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // Ora possiamo verificare valori esatti }
Non dimenticare mai di programmare i mock:
@Test
void convert_returnsExpectedValue() {
EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// Nessuna programmazione del mock: l’oggetto bank non sa rispondere a getRateEuroTo
double result = exchangeApp.convertEuroTo("USD", 1000);
assertEquals(1100, result); // Fallirà per mancanza di setup del mock
}
Il test fallisce con:
org.opentest4j.AssertionFailedError:
Expected :1100.0
Actual :0.0
Programmare un mock si chiama stubbing.
Stubbing: fornire risposte minime e predefinite alle chiamate durante il test, di solito ignorando tutto ciò che non è previsto dal test.
Mockito può simulare anche scenari di errore:
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
Introduzione al Testing in Java