2017-10-16 4 views
0

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?

+1

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. –

+0

J'utilise le contexte du ressort de test et l'injection fonctionne bien. Mon test fonctionne bien avec le multithreading. – Sviatlana

+0

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. –

Répondre

0

Vous devez probablement ajouter Thread.join() après remoteDIUpdater.start() pour empêcher le thread principal de se terminer avant votre thread.

+0

avec cette méthode est appelée qu'une seule fois. – Sviatlana

+0

Pourquoi supposez-vous que retryMethod sera appelé 5 fois? maxAttempts = 5 mais cela ne signifie pas que retryMethod sera appelée 5 fois – niemar

+0

doThrow (Exception.class) .when (service) .retryMethod (id, dId); - à cause de ce. – Sviatlana