我正在测试一个包装 Quartz Scheduler
对象的组件。
我的问题是 Quartz 正在内部进行一些异步处理,我无法在测试代码中编写如下内容:
Mockito.when(configurationMock.getId()).thenReturn(CONFIG_ID);
target.addJob(configurationMock);
Scheduler sched = (Scheduler) Whitebox.getInternalState(target, "scheduler");
assertTrue(sched.checkExists(new JobKey(configurationMock.getId())));
因为当我检查作业是否存在时,它可能还不存在。
我检查了 JUnit API,但没有 assertWithTimeout()
或类似的东西。我错过了什么吗?
最佳答案
我通常使用 CountDownLatch - 但它需要某种形式的回调方法,例如:
CountDownLatch done = new CountDownLatch(1);
target.onJobComplete(new Runnable() { public void run() {
done.countdown();
}});
Scheduler sched = (Scheduler) Whitebox.getInternalState(target, "scheduler");
done.await(timeout);
如果您没有回调或没有方法来检查任务是否已安排,您可以简单地等待:
target.addJob(configurationMock);
Scheduler sched = (Scheduler) Whitebox.getInternalState(target, "scheduler");
//wait up to 1 second
for (int i = 0; i < 100; i++) {
if (!sched.checkExists(new JobKey(configurationMock.getId()))) Thread.sleep(10);
else break;
}
assertTrue(sched.checkExists(new JobKey(configurationMock.getId())));
关于java - 如何测试某些异步过程的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21703242/