如何为TimerService调度程序准备基础测试?

时间:2019-07-08 11:28:41

标签: java-ee timer ejb schedule

实际上,我的代码运行良好,不幸的是,在尝试为TimerService编写集成和单元测试而未准备Arquillian容器时,我发现了一些问题。 我的代码简化了:

@Startup
@Singleton
public class GeneralDataExecutor {

    @Resource
    private TimerService timerService;

    private Timer timer;

    @PostConstruct
    public void init() {
            timer = timerService.createCalendarTimer(createScheduleExpression(), createTimerConfig());
        }
    }

    @Timeout
    public void execute() {
        //some code
    }
}

任何想法/提示如何完成工作?

2 个答案:

答案 0 :(得分:0)

有些框架可以模拟ejb容器,并有助于 处理异步。

看看 Example of a Timer-Bean

@Stateless
public class StatelessTimerEJB extends CountingBean {

   @PostConstruct
   public void postConstruct() {
       setPostConstructCalled();
   }

   @Timeout
   public void callAsynch()  {
       if (isPostConstructCalled()) {
           logcall();
           return;
       } else {
           logger.error("postconstruct did not work for this instance");
       }
   }
}

以及如何在

中使用ioc-unit Asynchronousmanager测试它

TestAsynchronousManager

答案 1 :(得分:0)

出于测试业务功能的目的,测试您的Timeout方法(“执行”)并模拟其他所有内容就足够了。

您不需要测试计时器功能,因为这不是您的代码,并且经过了大量测试。

示例:

import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
class GdeTest{
    @InjectMocks
    GeneralDataExecutor gde = new GeneralDataExecutor();

    @Mock
    TimerService timerService;

     @Test
     void testInitialize() {
     gde.execute();
     //your business assertions here

     //ensure timer initialization
     verify(timerService, times(1)).createCalendarTimer(any(ScheduleExpression.class), 
         any(TimerConfig.class));
     }
}