Как запустить аннотацию @Timeout?

Я создаю javax импорта javascript . аннотация . Ресурс ; импортировать javax . ejb . SessionContext ; импортировать javax . ejb . Таймер ; импортировать javax . ejb . Без гражданства ; импортировать javax . ejb . Тайм-аут ; @Stateless public class TimerSessionBean реализует TimerSessionBeanRemote { @Resource private SessionContext контекст ; public void createTimer ( длительная продолжительность ) { контекст . getTimerService (). createTimer ( продолжительность , «Hello World!» ); } @Timeout общественного аннулируются timeOutHandler ( Таймер таймер ) { System . из . println ( "timeoutHandler:" + таймер . getInfo ()); таймер . cancel (); } } Служебный макет. Есть ли способ вручную вызвать вызов метода с помощью аннотации @Timeout?

java,testing,junit,ejb,

3

Ответов: 2


3 "> принят
+50

Вы можете создать новый таймер с предпочтительной продолжительностью. Когда вам нужно вызвать тайм-аут, вызовите следующий сегмент кода с длительностью. Затем Framework должен вызывать метод тайм-аута в течение заданной продолжительности с этого момента.

контекст. getTimerService (). createTimer (продолжительность, «Hello World!»);

Полный код

instance.timeOutHandlerMethod

0

Теперь давайте учтем, что

Этот метод не является общедоступным.

Если вы хотите проверить только логику, содержащуюся в аннотированном методе @Timeout, существует несколько решений. Я бы рекомендовал последнее, потому что это также улучшит общий дизайн (см. Этот ответ ).

  1. Сделайте этот метод защищенным или закрытым пакетом. Это один из самых простых способов проверки этой логики.
  2. Используйте отражение или PowerMock для вызова частного метода.

Вот простой пример, предполагающий, что мы хотим вызвать timerэкземпляр Timer timer.

Whitebox.invokeMethod(instance, "timeOutHandlerMethod", timer);

Для получения дополнительной информации см. Страницу документа .

  1. Извлеките логику, чтобы разделить класс и протестировать его.

Здесь мы извлекаем логики от 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класса.

Java, тестирование, JUnit, EJB,
Похожие вопросы