Pour les tests unitaires, il est préférable de créer une méthode qui fait appel à l'actuel Thread.sleep(long l), puis de simuler cette méthode. Avec cela, vous pouvez injecter votre test avec un comportement génial qui fera que votre test pensera qu'il attend aussi longtemps que vous le souhaitez. Ainsi, vous pouvez exécuter un grand nombre de tests en un clin d'œil tout en testant différents scénarios liés au temps. Avant de l'utiliser, mon UnitTest durait six minutes. Maintenant, il dure moins de 200 ms.
public class TimeTools {
public long msSince(long msStart) {
return ((System.nanoTime() / 1_000_000) - msStart);
}
public long msNow() {
return (System.nanoTime() / 1_000_000);
}
public Boolean napTime(long msSleep) throws InterruptedException {
Thread.sleep(msSleep);
return true;
}
}
-----------------------------------
@Mock
TimeTools Timetools;
@TEST
public void timeTest() {
when(timeTools.msSince(anyLong()))
.thenReturn(0l)
.thenReturn(5_500l)
.thenReturn(11_000l)
.thenReturn(11_000l)
.thenReturn(0l)
.thenReturn(11_000l)
.thenReturn(11_000l)
.thenReturn(0l)
.thenReturn(29_000l);
}
Mais la meilleure approche est d'injecter le sleeper et de le simuler. Ainsi, dans vos tests, vous ne dormirez pas réellement. Vos tests unitaires s'exécuteront alors aussi rapidement que l'éclair.