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

}

私のテスト方法が間違っているのかもしれません。しかし、メソッドを次のように単純に呼び出すと(スレッドなし):

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

、私のテストメソッドは正常に実行されます。間違いは何ですか?

4

1 に答える 1

0

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

于 2017-10-16T08:38:23.613 に答える