Я пытаюсь проверить, повторялся ли мой вызов метода несколько раз, если возникло какое-то исключение. И если я вызываю метод напрямую, он работает нормально. Но если я вызову его в отдельном потоке, мой тестовый метод завершится ошибкой, он не увидит никаких повторных попыток. Это мои методы:
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);
}
, мой тестовый метод работает нормально. В чем ошибка?
@Inject
бесполезен), и поэтому@Retry
ничего не сделает. - person M. Deinum   schedule 16.10.2017@InjectMocks
делает@Inject
бесполезным, поскольку он создаст новый экземпляр и внедрит в него издевательские зависимости. Он не будет использовать экземпляр, введенный Spring. Следовательно, ваш тест просто неверен. - person M. Deinum   schedule 16.10.2017@Retry
работает с АОП, который применяется через Spring. Поскольку вы используете@ InjectMocks
, вы получаете новый экземпляр без прокси. В основном вы получаетеnew MyClass()
здесь без применения АОП. Итак, ваш тест снова неверен. - person M. Deinum   schedule 16.10.2017@Async
и реализовать другой способ выполнения повторных попыток. - person M. Deinum   schedule 16.10.2017