如何测试某些异步进程的结果?

时间:2014-02-11 13:29:48

标签: java testing asynchronous junit

我正在测试一个包含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()或类似的东西。我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

我通常使用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())));