java - 如何测试某些异步过程的结果?

标签 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() 或类似的东西。我错过了什么吗?

最佳答案

我通常使用 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/

相关文章:

java - JAXB 按需解码

java - Map键比较中使用的equals方法

php - 这种做法在 phpunit 上好吗?

python - 将自主游戏模型与基于 Qt 的 UI 连接起来

c# - 使用Continuation链接任务的正确方法

Javascript/jQuery - 是否可以封装并返回异步执行函数的结果?

java - 是否可以在 Junit 5 中使用 Java 功能接口(interface)实现(例如 Supplier)作为 MethodSource?

java - 如何在基于 Java 的 DynamoDB 应用程序中设置 TTL

ruby-on-rails - 无法在 sign_out 方法的功能测试中销毁 current_user

testing - 我们应该如何自动化系统测试?