Как вызвать аннотацию @Timeout?


Я создаю макет EJB TimerService. Есть ли способ вручную вызвать вызов метода с аннотацией @Timeout?

2 3

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, Существует несколько решений. Я бы рекомендовал последнее, потому что это также улучшило бы общий дизайн (см. этот ответ).
  1. сделайте этот метод защищенным или пакетно-приватным. Это самый простой способ сделать эту логику проверяемой.
  2. используйте отражение или PowerMock, чтобы вызов частного метода.

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

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

Смотрите doc page для получения более подробной информации.

  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.