J'essaie de tester si mon appel de méthode a été réessayé plusieurs fois si une exception a lieu. Et si j'appelle la méthode directement, ça fonctionne bien. Mais si je l'appelle dans un fil séparé, ma méthode de test échoue, elle ne voit aucune tentative de nouvelle tentative. Voilà mes méthodes:Retryable ne fonctionne pas dans un thread séparé
public class MyClass {
@Inject
private ServiceClass service;
@Retryable(value = {Exception.class}, maxAttempts = 5, backoff = @Backoff(delay = 30000))
public void retryMethod(Integer id, double dId)
{
Thread remoteDIUpdater = new Thread(() -> {
service.updateIndex(id, dId);
}
);
remoteDIUpdater.setDaemon(true);
remoteDIUpdater.setName("RemoteDIUpdaterThread");
remoteDIUpdater.start();
}
@Recover
public void recover(Exception ex, Integer id, double dId)
{
logger.error("Error", ex);
}
}
Et voici ma classe de test:
public class TestClass
{
@Inject
@InjectMocks
private MyClass myClass;
@Mock
private private ServiceClass service;
@Test
public void testMethod()
{
Integer id = 1;
double dId = 2d;
doThrow(Exception.class).when(service).retryMethod(id, dId);
myClass.updateBetDangerIndex(betId, dangerIndex);
verify(service, Mockito.times(5)).retryMethod(null, id, iId);
}
}
Peut-être que ma méthode de test est faux. MAIS si j'appelle ma méthode simplement comme ceci (thread withot):
@Retryable(value = {Exception.class}, maxAttempts = 5, backoff = @Backoff(delay = 30000))
public void retryMethod(Integer id, double dId)
{
service.updateIndex(id, dId);
}
, ma méthode d'essai fonctionne bien. Quelle est l'erreur?
Votre test est erroné. Vous vous moquez des choses et vous créez une nouvelle instance vous-même (en gros, '@ Inject' est inutile) et en tant que tel,' @ Retry' ne fera rien. –
J'utilise le contexte du ressort de test et l'injection fonctionne bien. Mon test fonctionne bien avec le multithreading. – Sviatlana
Non, ça ne l'est pas ... Le '@ InjectMocks' rend le' @ Inject' inutile car il va construire une nouvelle instance et y injecter les dépendances mockées. Il n'utilisera pas l'instance injectée par Spring. D'où votre test est juste faux. –