何らかの例外が発生した場合、私のメソッド呼び出しが何回か再試行されたかどうかをテストしようとしています。メソッドを直接呼び出すと大丈夫です。しかし、別のスレッドで呼び出すと、テストメソッドが失敗して再試行の試行が見られなくなります。再試行可能は別のスレッドでは機能しません
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);
}
私のテストメソッドは正常に実行されます。間違いは何ですか?
あなたのテストは間違っています。あなたは物事を嘲笑して自分で新しいインスタンスを作成しています(基本的に '@ Inject'は無意味です)、' @ Retry'は何もしません。 –
私はテストスプリングコンテキストを使用しており、注入はうまく動作します。私のテストは良い出力マルチスレッドです。 – Sviatlana
いいえ... '@ InjectMocks'は' @ InjectM'を新しいインスタンスを構築し、擬似依存関係をそれに注入するので、無駄なものを描画します。 Springがインジェクトしたインスタンスは使用しません。したがって、あなたのテストは間違っています。 –