Community编程与开发github.com

giuseppe-trisciuoglio/unit-test-scheduled-async(Spring定时与异步方法单元…

提供针对 Spring `@Scheduled` 和 `@Async` 方法的单元测试模式,使用 JUnit 5、CompletableFuture、Awaitility 和 Mockito 进行测试。

unit-test-scheduled-async(Spring定时与异步方法单元… 是什么?

此技能提供了一套完整的模式,用于对 Spring 框架中带有 `@Scheduled` 和 `@Async` 注解的方法进行单元测试。它利用了 JUnit 5、CompletableFuture、Awaitility 和 Mockito 等流行测试工具,使开发者能够模拟任务执行和时间控制、验证执行次数、测试 cron 表达式、验证重试行为以及模拟线程池行为。通过遵循这些模式,开发者可以编写可靠且可维护的测试,以确保后台任务、定时任务、周期性执行和异步操作的正确性。该技能支持与 Spring 集成测试环境类似的行为模拟,无需实际依赖底层调度器或异步执行器,从而提升了测试的隔离性和速度。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit/tree/main/skills/unit-test-scheduled-async

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

giuseppe-trisciuoglio/unit-test-scheduled-async(Spring定时与异步方法单元测试)

提供针对 Spring @Scheduled 和 @Async 方法的单元测试模式,使用 JUnit 5、CompletableFuture、Awaitility 和 Mockito 进行测试。涵盖了模拟任务执行和时间控制、验证执行次数、测试 cron 表达式、验证重试行为以及模拟线程池行为。适用于测试后台任务、cron 作业、周期性执行、定时任务或线程池行为。

使用场景

  • 测试 Spring 中的 @Scheduled 方法(例如 cron 作业、固定延迟、固定速率)。
  • 测试 Spring 中的 @Async 方法(例如异步任务、Future 返回类型)。
  • 验证任务执行次数和时序。
  • 测试 cron 表达式逻辑。
  • 验证重试机制(如 @Retryable)。
  • 测试自定义线程池行为。

支持平台

  • Spring Framework(5.x 及以上)
  • Spring Boot(2.x 及以上)
  • JUnit 5
  • Mockito
  • Awaitility
  • CompletableFuture(Java 8+)

快速开始

1. 添加依赖

<!-- Maven 依赖示例 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.awaitility</groupId>
    <artifactId>awaitility</artifactId>
    <scope>test</scope>
</dependency>

2. 测试 @Scheduled 方法

import static org.mockito.Mockito.*;
import static org.awaitility.Awaitility.await;

@ExtendWith(MockitoExtension.class)
class ScheduledTaskTest {

    @Mock
    private SomeRepository repository;

    private ScheduledTask task;

    @BeforeEach
    void setUp() {
        task = new ScheduledTask(repository);
    }

    @Test
    void shouldExecuteScheduledTask() {
        // 模拟任务执行
        task.run();

        // 验证执行次数
        verify(repository, times(1)).update();
    }

    @Test
    void shouldWaitForAsyncCompletion() {
        // 启动异步任务
        CompletableFuture<Void> future = task.asyncOperation();

        // 等待完成
        await().atMost(5, SECONDS).until(future::isDone);

        // 验证结果
        verify(repository).save(any());
    }
}

3. 测试 @Async 方法

@SpringBootTest
class AsyncTaskTest {

    @Autowired
    private AsyncTask asyncTask;

    @Test
    void shouldHandleMultipleAsyncCalls() throws Exception {
        CompletableFuture<String> future1 = asyncTask.process();
        CompletableFuture<String> future2 = asyncTask.process();

        CompletableFuture.allOf(future1, future2).join();

        assertEquals("完成", future1.get());
        assertEquals("完成", future2.get());
    }
}

常见模式

模拟任务执行时序

使用 Awaitility 等待特定条件:

await().atMost(10, SECONDS)
   .until(() -> repository.updateCount() == 5);

测试 cron 表达式

@ParameterizedTest
@CsvSource({
    "0 0 * * * *, 每小时执行",
    "0 0 0 * * *, 每天午夜执行"
})
void shouldParseCronExpression(String cronExpression, String description) {
    CronExpression cron = new CronExpression(cronExpression);
    assertNotNull(cron.getNextValidTimeAfter(new Date()));
}

验证重试行为

@Test
void shouldRetryOnFailure() {
    when(repository.save(any()))
        .thenThrow(new RuntimeException("临时错误"))
        .thenReturn("成功");

    String result = task.retryableOperation();

    assertEquals("成功", result);
    verify(repository, times(2)).save(any());
}

模拟线程池行为

@Test
void shouldUseCustomThreadPool() {
    ExecutorService executor = Executors.newFixedThreadPool(2);
    task.setExecutor(executor);

    // 执行任务
    task.runWithExecutor();

    // 验证执行在正确的线程中
    assertTrue(executor.isShutdown());
}

最佳实践

  1. 隔离测试:避免启动完整 Spring 上下文,优先使用 @Mock 和 @InjectMocks。
  2. 显式等待:对于异步操作,始终使用 Awaitility 而非 Thread.sleep()。
  3. 模拟时间:使用 Clock 或 Date mock 来控制时间,而非依赖真实时间。
  4. 测试边界条件:测试 cron 表达式的边界值(例如每月的最后一天、闰年)。
  5. 验证异常处理:确保重试和错误处理逻辑已覆盖。

贡献

欢迎提交问题(issues)和拉取请求(pull requests)。请遵循现有代码风格和测试规范。

许可证

MIT

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

giuseppe-trisciuoglio/aws-lambda-java-integration

Provides AWS Lambda integration patterns for Java with cold start optimization. Use when deploying Java functions to AWS Lambda, choosing between Micronaut and Raw Java approaches, optimizing cold starts below 1 second, configuring API Gateway or ALB integration, or implementing serverless Java applications. Triggers include "create lambda java", "deploy java lambda", "micronaut lambda aws", "java lambda cold start", "aws lambda java performance", "java serverless framework".

giuseppe-trisciuoglio/aws-lambda-php-integration

Provides AWS Lambda integration patterns for PHP with Symfony using the Bref framework. Creates Lambda handler classes, configures runtime layers, sets up SQS/SNS event triggers, implements warm-up strategies, and optimizes cold starts. Use when deploying PHP/Symfony applications to AWS Lambda, configuring API Gateway integration, implementing serverless PHP applications, or optimizing Lambda performance with Bref. Triggers include "create lambda php", "deploy symfony lambda", "bref lambda aws", "php lambda cold start", "aws lambda php performance", "symfony serverless", "php serverless framework".

giuseppe-trisciuoglio/aws-lambda-python-integration

Provides AWS Lambda integration patterns for Python with cold start optimization. Use when deploying Python functions to AWS Lambda, choosing between AWS Chalice and raw Python approaches, optimizing cold starts, configuring API Gateway or ALB integration, or implementing serverless Python applications. Triggers include "create lambda python", "deploy python lambda", "chalice lambda aws", "python lambda cold start", "aws lambda python performance", "python serverless framework".

giuseppe-trisciuoglio/aws-lambda-typescript-integration

Provides AWS Lambda integration patterns for TypeScript with cold start optimization. Use when creating or deploying TypeScript Lambda functions, choosing between NestJS framework and raw TypeScript approaches, optimizing cold starts, configuring API Gateway or ALB integration, or implementing serverless TypeScript applications. Triggers include "create lambda typescript", "deploy typescript lambda", "nestjs lambda aws", "raw typescript lambda", "aws lambda typescript performance".

giuseppe-trisciuoglio/aws-rds-spring-boot-integration

Provides patterns to configure AWS RDS (Aurora, MySQL, PostgreSQL) with Spring Boot applications. Configures HikariCP connection pools, implements read/write splitting, sets up IAM database authentication, enables SSL connections, and integrates with AWS Secrets Manager. Use when setting up RDS connections in Spring Boot, configuring connection pooling, or managing database credentials securely.

giuseppe-trisciuoglio/aws-sdk-java-v2-bedrock

Provides Amazon Bedrock patterns using AWS SDK for Java 2.x. Invokes foundation models (Claude, Llama, Titan), generates text and images, creates embeddings for RAG, streams real-time responses, and configures Spring Boot integration. Use when asking about Bedrock integration, Java SDK for AI models, AWS generative AI, Claude/Llama invocation, embeddings for RAG, or Spring Boot AI setup.

giuseppe-trisciuoglio/aws-sdk-java-v2-core

Provides AWS SDK for Java 2.x client configuration, credential resolution, HTTP client tuning, timeout, retry, and testing patterns. Use when creating or hardening AWS service clients, wiring Spring Boot beans, debugging auth or region issues, or choosing sync vs async SDK usage.

giuseppe-trisciuoglio/aws-sdk-java-v2-dynamodb

Provides Amazon DynamoDB patterns using AWS SDK for Java 2.x. Use when creating, querying, scanning, or performing CRUD operations on DynamoDB tables, working with indexes, batch operations, transactions, or integrating with Spring Boot applications.

giuseppe-trisciuoglio/aws-sdk-java-v2-kms

Provides AWS Key Management Service (KMS) patterns using AWS SDK for Java 2.x. Use when creating/managing encryption keys, encrypting/decrypting data, generating data keys, digital signing, key rotation, or integrating encryption into Spring Boot applications.

giuseppe-trisciuoglio/aws-sdk-java-v2-lambda

Provides AWS Lambda patterns using AWS SDK for Java 2.x. Use when invoking Lambda functions, creating/updating functions, managing function configurations, working with Lambda layers, or integrating Lambda with Spring Boot applications.

giuseppe-trisciuoglio/aws-sdk-java-v2-messaging

Provides AWS messaging patterns using AWS SDK for Java 2.x for SQS queues and SNS topics. Handles sending/receiving messages, FIFO queues, DLQ, subscriptions, and pub/sub patterns. Use when implementing messaging with SQS or SNS.

giuseppe-trisciuoglio/aws-sdk-java-v2-rds

Provides AWS RDS (Relational Database Service) management patterns using AWS SDK for Java 2.x. Use when creating, modifying, monitoring, or managing Amazon RDS database instances, snapshots, parameter groups, and configurations.

giuseppe-trisciuoglio/aws-sdk-java-v2-s3

Provides Amazon S3 patterns and examples using AWS SDK for Java 2.x. Use when working with S3 buckets, uploading/downloading objects, multipart uploads, presigned URLs, S3 Transfer Manager, object operations, or S3-specific configurations.

giuseppe-trisciuoglio/aws-sdk-java-v2-secrets-manager

Provides AWS Secrets Manager patterns for AWS SDK for Java 2.x, including secret retrieval, caching, rotation-aware access, and Spring Boot integration. Use when storing or reading secrets in Java services, replacing hardcoded credentials, or wiring secret-backed configuration into applications.

giuseppe-trisciuoglio/better-auth

Provides Better Auth integration patterns for NestJS backend and Next.js frontend with Drizzle ORM and PostgreSQL. Use when setting up Better Auth with NestJS backend, integrating Next.js App Router frontend, configuring Drizzle ORM schema, implementing social login (GitHub, Google), adding plugins (2FA, Organization, SSO, Magic Link, Passkey), implementing email/password authentication with session management, or creating protected routes and middleware.

giuseppe-trisciuoglio/chunking-strategy

Provides chunking strategies for RAG systems. Generates chunk size recommendations (256-1024 tokens), overlap percentages (10-20%), and semantic boundary detection methods. Validates semantic coherence and evaluates retrieval precision/recall metrics. Use when building retrieval-augmented generation systems, vector databases, or processing large documents.

giuseppe-trisciuoglio/clean-architecture

Provides implementation patterns for Clean Architecture, Hexagonal Architecture (Ports & Adapters), and Domain-Driven Design in Java 21+ Spring Boot 3.5+ applications. Use when structuring layered architectures, separating domain logic from frameworks, implementing ports and adapters, creating entities/value objects/aggregates, or refactoring monolithic codebases for testability and maintainability.

giuseppe-trisciuoglio/docs-updater

Provides automated documentation updates by analyzing git changes between the current branch and the last release tag. Performs git diff analysis to identify modifications, then updates README.md, CHANGELOG.md following Keep a Changelog standard, and discovers documentation folders for contextual updates. Use when preparing a release, maintaining documentation sync, or before creating a pull request. Triggers on "update docs", "update changelog", "sync documentation", "update readme", "prepare release documentation".

giuseppe-trisciuoglio/drawio-logical-diagrams

Creates professional logical flow diagrams and logical system architecture diagrams using draw.io XML format (.drawio files). Use when creating: (1) logical flow diagrams showing data/process flow between system components, (2) logical architecture diagrams representing system structure without cloud provider specifics, (3) BPMN process diagrams, (4) UML diagrams (class, sequence, activity), (5) data flow diagrams (DFD), (6) decision flowcharts, or (7) system interaction diagrams. This skill focuses on generic/abstract representations, not AWS/Azure-specific architectures (use aws-drawio-architecture-diagrams for cloud diagrams).

giuseppe-trisciuoglio/drizzle-orm-patterns

Provides comprehensive Drizzle ORM patterns for schema definition, CRUD operations, relations, queries, transactions, and migrations. Proactively use for any Drizzle ORM development including defining database schemas, writing type-safe queries, implementing relations, managing transactions, and setting up migrations with Drizzle Kit. Supports PostgreSQL, MySQL, SQLite, MSSQL, and CockroachDB.

相关技能