我正在创建一个EJB TimerService模拟。有没有办法手动触发带有@Timeout注释的方法的调用?
答案 0 :(得分:3)
您可以使用首选持续时间创建新计时器。当你需要调用超时时,请调用带有持续时间的代码段。然后,Framework应该在给定的持续时间内调用timeout方法。
context。getTimerService()。createTimer(持续时间," Hello World!");
完整代码
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();
}
}
答案 1 :(得分:0)
现在让我们考虑一下
该方法不公开。
如果您只想测试用@Timeout
注释的方法中包含的逻辑,则解决方案很少。
我会推荐最后一个,因为它也会改善整体设计(见this answer)。
这是一个简单的例子,假设我们想要使用Timer实例instance.timeOutHandlerMethod
调用timer
。
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
类编写一个测试。