Introduction aux tests en Java
Maria Milusheva
Senior Software Engineer
Rappelez-vous le flot de dépendances de la leçon précédente : l'appli de change dépend du serveur bancaire :

Impossible de vérifier les calculs, car les taux de change sont par nature imprévisibles.
Mocking – créer des objets ou comportements simulés pour des objets réels difficiles à utiliser en test, afin d'éprouver le code sans dépendances externes.
Mockito – puissante bibliothèque Java pour créer des mocks.
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Reprenez la leçon précédente :
public double convertEuroTo(String currency, double amount) {
double rate = this.bank.getRateEuroTo(currency);
return amount * rate;
}
➡ Créer un objet prévisible pour EuropeanCentralBankServer lors des tests
Voici comment tester avec des mocks :
@Test void convert_returnsExpectedValue() { EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class); ExchangeApp exchangeApp = new ExchangeApp(bank);// Il faut programmer le mock pour qu'il fonctionne when(bank.getRateEuroTo("USD")).thenReturn(1.1);// Appelle getRateEuroTo sur le mock et obtient nos valeurs préprogrammées double result = exchangeApp.convertEuroTo("USD", 1000); assertEquals(1100, result); // On peut maintenant vérifier des valeurs exactes }
N'oubliez jamais de programmer vos mocks :
@Test
void convert_returnsExpectedValue() {
EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// Aucune programmation du mock – l'objet bank simulé ne sait pas répondre à getRateEuroTo
double result = exchangeApp.convertEuroTo("USD", 1000);
assertEquals(1100, result); // Échouera faute de configuration du mock
}
Le test échoue avec :
org.opentest4j.AssertionFailedError:
Expected :1100.0
Actual :0.0
Programmer un mock s'appelle stubbing.
Stubbing – fournir des réponses minimales et prédéfinies aux appels durant le test, sans réagir à quoi que ce soit en dehors de ce qui est programmé.
Mockito peut aussi simuler des erreurs :
EuropeanCentralBankServer bank = mock(EuropeanCentralBankServer.class);
ExchangeApp exchangeApp = new ExchangeApp(bank);
// Au lieu de thenReturn(), utiliser thenThrow()
when(bank.getRateEuroTo("USD"))
.thenThrow(new RuntimeException("Bank server unavailable."));
exchangeApp.convertEuroTo("USD", 1000); // getRateEuroTo lèvera une exception
Introduction aux tests en Java