Как вызвать аннотацию @Timeout?
Я создаю макет EJB TimerService. Есть ли способ вручную вызвать вызов метода с аннотацией @Timeout?
2 ответа:
Вы можете создать новый таймер с предпочтительной длительностью. Когда вам нужно вызвать тайм-аут, вызовите следующий сегмент кода с длительностью. Тогда основа должна вызвать метод тайм-аута за указанный период от Сейчас.
Контекст.getTimerService ().createTimer (Продолжительность: "Привет, Мир!");
Полный код
import javax.annotation.Resource; import javax.ejb.SessionContext; import javax.ejb.Timer; import javax.ejb.Stateless; import javax.ejb.Timeout; @Stateless public class TimerSessionBean implements TimerSessionBeanRemote { @Resource private SessionContext context; public void createTimer(long duration) { context.getTimerService().createTimer(duration, "Hello World!"); } @Timeout public void timeOutHandler(Timer timer){ System.out.println("timeoutHandler : " + timer.getInfo()); timer.cancel(); } }
Теперь давайте примем во внимание, что
Метод не является общедоступным.Если вы хотите проверить только логику, содержащуюся в методе с аннотацией@Timeout
, Существует несколько решений. Я бы рекомендовал последнее, потому что это также улучшило бы общий дизайн (см. этот ответ).
- сделайте этот метод защищенным или пакетно-приватным. Это самый простой способ сделать эту логику проверяемой.
- используйте отражение или PowerMock, чтобы вызов частного метода.
Вот простой пример, предполагающий, что мы хотим вызвать
instance.timeOutHandlerMethod
с помощью экземпляра Timertimer
.Whitebox.invokeMethod(instance, "timeOutHandlerMethod", timer);
Смотрите doc page для получения более подробной информации.
- выделить логику в отдельный класс и проверить его.
Здесь мы извлекаем логику из
this.timeOutHandler
вDelegate.execute
:@Timeout private void timeOutHandler(Timer timer) { // some complicated logic timer.cancel(); }
К этому:
private Delegate delegate; @Timeout private void timeOutHandler(Timer timer) { delegate.execute(timer); }
С
Delegate
объявленным как:Теперь мы можем написать тест для классаclass Delegate { public void execute(Timer timer) { // some complicated logic timer.cancel(); } }
Delegate
.