SuperAPI AI 工具集

unit-test-scheduled-async

测试与质量

查看项目

更新于 10-16 07:20

技能介绍

用途:为 Spring 中标注 @Scheduled 和 @Async 的方法编写单元测试,无需等待真实调度周期或异步线程池,即可验证方法逻辑、异步结果、异常传播与执行次数。

主要能力:直接调用 @Async 方法并使用 CompletableFuture.get(timeout, unit) 获取结果;直接调用 @Scheduled 方法,忽略 cron 与 fixedRate 等注解;用 Mockito 的 @Mock、@InjectMocks 模拟依赖;用 Awaitility 的 await().atMost(...).pollInterval(...).untilAsserted(...) 处理共享可变状态的竞态;验证 CompletableFuture.get() 抛出的 ExecutionException 及其 getCause();断言执行次数。

使用方式:@Async 方法直接调用即可,单元测试中注解无意义;@Scheduled 方法同样直接调用。等待完成用 CompletableFuture.get(5, TimeUnit.SECONDS) 或 Awaitility。先断言返回值,再 verify 模拟交互;捕获 ExecutionException 后检查 .getCause()。Awaitility 超时可增大 atMost() 或减小 pollInterval()。

适用场景:测试 @Scheduled 业务逻辑、@Async 行为、CompletableFuture 结果、异步错误处理、cron 逻辑与线程池执行次数、后台任务隔离测试。

限制:同类的 @Async 自调用会绕过 Spring 代理从而同步执行;ThreadPoolTaskScheduler 不保证执行顺序;CompletableFuture 中间阶段异常可能被静默丢失;Awaitility 必须设置合理 atMost(),否则无限等待会挂起测试;单元测试中 @Scheduled 被忽略,不存在真实调度。完整 Maven/Gradle 依赖与更多示例见 references/examples.md。