2017-10-16 3 views
0

何らかの例外が発生した場合、私のメソッド呼び出しが何回か再試行されたかどうかをテストしようとしています。メソッドを直接呼び出すと大丈夫です。しかし、別のスレッドで呼び出すと、テストメソッドが失敗して再試行の試行が見られなくなります。再試行可能は別のスレッドでは機能しません

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'は' @ InjectM'を新しいインスタンスを構築し、擬似依存関係をそれに注入するので、無駄なものを描画します。 Springがインジェクトしたインスタンスは使用しません。したがって、あなたのテストは間違っています。 –

答えて

0

おそらく、スレッドの前にメインスレッドが終了しないように、remoteDIUpdater.start()の後にThread.join()を追加する必要があります。

+0

は1回だけ呼び出されます。 – Sviatlana

+0

なぜretryMethodが5回呼び出されると思いますか? maxAttempts = 5ですが、retryMethodが5回呼び出されることを意味しません。 – niemar

+0

doThrow(Exception.class).when(service).retryMethod(id、dId); - このため。 – Sviatlana

関連する問題