我想测试,如果我的方法调用被重试几次,如果发生一些异常。如果我直接调用方法,它可以正常工作。但是如果我在单独的线程中调用它,我的测试方法失败,它不会看到任何重试尝试。 这是我的方法: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);
}
,我的测试方法运行正常。什么是错误?
你的测试是错误的。你嘲笑事物并自己创建一个新实例(基本上'@ Inject'是无用的),因此'@Retry'什么也不做。 –
我正在使用测试春天上下文并注入很好的作品。我的测试适用于多线程输入。 – Sviatlana
不,它不会...... @ @ InjectMocks呈现@ @ Inject无用,因为它会构造一个新实例,并将嘲讽的依赖注入到它中。它不会使用Spring注入的实例。因此你的测试是错误的。 –