2017-10-16 156 views
0

我想测试,如果我的方法调用被重试几次,如果发生一些异常。如果我直接调用方法,它可以正常工作。但是如果我在单独的线程中调用它,我的测试方法失败,它不会看到任何重试尝试。 这是我的方法:Retryable不能在单独的线程中工作

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); 
     } 
} 

这是我的测试类:

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); 
    } 

} 

也许我的测试方法是错误的。但如果我把我的方法简单地像这样(withot线程):

@Retryable(value = {Exception.class}, maxAttempts = 5, backoff = @Backoff(delay = 30000)) 
      public void retryMethod(Integer id, double dId) 
      {    
       service.updateIndex(id, dId);    
      } 

,我的测试方法运行正常。什么是错误?

+1

你的测试是错误的。你嘲笑事物并自己创建一个新实例(基本上'@ Inject'是无用的),因此'@Retry'什么也不做。 –

+0

我正在使用测试春天上下文并注入很好的作品。我的测试适用于多线程输入。 – Sviatlana

+0

不,它不会...... @ @ InjectMocks呈现@ @ Inject无用,因为它会构造一个新实例,并将嘲讽的依赖注入到它中。它不会使用Spring注入的实例。因此你的测试是错误的。 –

回答

0

可能你必须在remoteDIUpdater.start()之后添加Thread.join(),以防止主线程在线程之前完成。

+0

只调用一次。 – Sviatlana

+0

为什么你认为retryMethod会被调用5次? maxAttempts = 5,但这并不意味着retryMethod将被调用5次 – niemar

+0

doThrow(Exception.class).when(service).retryMethod(id,dId); - 因为这个。 – Sviatlana

相关问题