Mockito (qui est déjà fourni via des dépendances transitives pour les projets Spring Boot) dispose de plusieurs moyens d'attendre que des événements asynchrones, respectivement des conditions, se produisent.
Un modèle simple qui fonctionne actuellement très bien pour nous est le suivant :
// ARRANGE – instantiate Mocks, setup test conditions
// ACT – the action to test, followed by:
Mockito.verify(myMockOrSpy, timeout(5000).atLeastOnce()).delayedStuff();
// further execution paused until `delayedStuff()` is called – or fails after timeout
// ASSERT – assertThat(...)
Deux autres légèrement plus complexes mais plus sophistiquées sont décrites dans cet article por @fernando-cejas
Mon conseil urgent concernant les meilleures réponses actuelles données ici : vous voulez que vos tests
- finir aussi vite que possible
- obtenir des résultats cohérents, indépendamment de l'environnement d'essai (non "bancal")
... alors ne faites pas l'idiot en utilisant Thread.sleep()
dans votre code de test.
Au lieu de cela, faites en sorte que votre code de production utilise l'injection de dépendances (ou, de manière un peu plus "sale", exposez quelques méthodes mockables/spyables) puis utilisez Mockito, En attente de , ConcurrentUnit ou autres pour s'assurer que les conditions préalables asynchrones sont remplies avant que les assertions ne se produisent.