实际上,我的代码运行良好,不幸的是,在尝试为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
}
}
任何想法/提示如何完成工作?
答案 0 :(得分:0)
有些框架可以模拟ejb容器,并有助于 处理异步。
@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测试它答案 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));
}
}