Agent Skills by ALSEL
Anthropic Claudeその他⭐ リポ 0品質スコア 50/100

unit-test-scheduled-async

Springの`@Scheduled`・`@Async`メソッドをJUnit 5、CompletableFuture、Awaitility、Mockitoを使ってユニットテストするためのパターンを提供します。タスク実行・タイミングのモック、実行回数の検証、cron式のテスト、リトライ動作の検証、スレッドプールのシミュレーションをカバーします。バックグラウンドタスク、cronジョブ、定期実行、スケジュールタスク、スレッドプールの動作をテストする際に活用してください。

description の原文を見る

Provides patterns for unit testing Spring `@Scheduled` and `@Async` methods using JUnit 5, CompletableFuture, Awaitility, and Mockito. Covers mocking task execution and timing, verifying execution counts, testing cron expressions, validating retry behavior, and simulating thread pool behavior. Use when testing background tasks, cron jobs, periodic execution, scheduled tasks, or thread pool behavior.

SKILL.md 本文

@Scheduled および @Async メソッドのユニットテスト

概要

Spring の @Scheduled および @Async メソッドをJUnit 5でユニットテストするためのパターン集。CompletableFuture の結果をテストし、Awaitility を使用して競合状態に対応し、スケジュール実行をモック化し、エラーハンドリングを検証します。実際のスケジューリング間隔を待つ必要はありません。

使用時期

  • @Scheduled メソッドロジックのテスト
  • @Async メソッド動作のテスト
  • CompletableFuture 結果の検証
  • 非同期エラーハンドリングのテスト
  • 実際のスケジューリングを待たずにcron式ロジックをテスト
  • スレッドプール動作と実行回数の検証
  • バックグラウンドタスクロジックの単体テスト

手順

  1. @Async メソッドを直接呼び出す — Spring の非同期プロキシをバイパスする; ユニットテストではアノテーションは無視される
  2. 依存関係をモック化する@Mock および @InjectMocks (Mockito) を使用
  3. 完了を待つCompletableFuture.get(timeout, unit) または await().atMost(...).untilAsserted(...) を使用
  4. @Scheduled メソッドを直接呼び出す — cron/fixedRate を待たない; ユニットテストではアノテーションは無視される
  5. 例外パスをテストするCompletableFuture.get()ExecutionException がラップされていることを確認

検証ポイント:

  • CompletableFuture.get() の後、モック相互作用を検証する前に戻り値をアサート
  • ExecutionException がスローされた場合、.getCause() で根本例外を確認
  • Awaitility がタイムアウトした場合、atMost() の時間を増やすか pollInterval() を短縮して条件に到達するまで調整
  • 複数のタスク呼び出し後、verify() 呼び出しの前に実行回数をアサート

主なパターン — references/examples.md に完全な例があります:

// @Async: 直接呼び出し、CompletableFuture.get(timeout, unit) で待つ
@Service
class EmailService {
  @Async
  public CompletableFuture<Boolean> sendEmailAsync(String to) {
    return CompletableFuture.supplyAsync(() -> true);
  }
}
@Test
void shouldReturnCompletedFuture() throws Exception {
  EmailService service = new EmailService();
  Boolean result = service.sendEmailAsync("test@example.com").get(5, TimeUnit.SECONDS);
  assertThat(result).isTrue();
}

// @Scheduled: 直接呼び出し、リポジトリをモック化
@Component
class DataRefreshTask {
  @InjectMocks private DataRepository dataRepository;
  @Scheduled(fixedDelay = 60000) public void refreshCache() { /* ... */ }
}
@Test
void shouldRefreshCache() {
  when(dataRepository.findAll()).thenReturn(List.of(new Data(1L, "item1")));
  dataRefreshTask.refreshCache();
  verify(dataRepository).findAll();
}

// Awaitility: 共有可変状態での競合状態に使用
@Test
void shouldProcessAllItems() {
  BackgroundWorker worker = new BackgroundWorker();
  worker.processItems(List.of("item1", "item2", "item3"));
  Awaitility.await()
    .atMost(Duration.ofSeconds(5))
    .pollInterval(Duration.ofMillis(100))
    .untilAsserted(() -> assertThat(worker.getProcessedCount()).isEqualTo(3));
}

// モック化された依存関係と例外ハンドリング
@Test
void shouldHandleAsyncExceptionGracefully() {
  doThrow(new RuntimeException("Email failed")).when(emailService).send(any());
  CompletableFuture<String> result = service.notifyUserAsync("user123");
  assertThatThrownBy(result::get)
    .isInstanceOf(ExecutionException.class)
    .hasCauseInstanceOf(RuntimeException.class);
}

Maven/Gradle の依存関係の詳細、追加テストクラス、実行回数パターン: references/examples.md を参照してください。

ベストプラクティス

  • CompletableFuture.get() には常に タイムアウト を設定し、テストのハング防止
  • すべての依存関係をモック化 — ユニットテストで実際の外部サービスを呼び出さない
  • Awaitility は競合状態に のみ使用; 単純な非同期メソッドは直接呼び出しを推奨
  • @Scheduled ロジック を直接テスト — ユニットテストではアノテーションは無視される
  • モック相互作用の検証前に値をアサート; 非同期完了 後に 検証

よくある落とし穴

  • Spring の非同期エグゼキューターに依存する代わりにメソッドを直接呼び出すべき
  • CompletableFuture.get() でタイムアウトを忘れる
  • 非同期メソッド内の例外伝播テストを忘れる
  • 非同期メソッドが内部で呼び出す依存関係をモック化しない
  • 実際のcron/fixedRate タイミングを待つ代わりにロジックを単体テストすべき

制約と警告

  • @Async 自己呼び出し: 同じクラス内の別のメソッドから @Async を呼び出すと同期実行される — Spring プロキシはバイパスされる
  • スレッドプール順序: ThreadPoolTaskScheduler は実行順序を保証しない
  • CompletableFuture チェーン: 中間段階の例外はサイレント喪失の可能性 — 各段階をテスト
  • Awaitility タイムアウト: 常に合理的な atMost() を設定; 無限待機はテストスイートをハング
  • 実際のスケジューリングなし: @Scheduled はユニットテストで無視される — メソッドを直接呼び出す

参考資料

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
giuseppe-trisciuoglio
リポジトリ
giuseppe-trisciuoglio/developer-kit
ライセンス
MIT
最終更新
不明

Source: https://github.com/giuseppe-trisciuoglio/developer-kit / ライセンス: MIT

関連スキル

汎用その他⭐ リポ 1,982

superfluid

Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper

by LeoYeAI
汎用その他⭐ リポ 100

civ-finish-quotes

実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。

by huxiuhan
汎用その他⭐ リポ 1,110

nookplot

Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。

by BankrBot
汎用その他⭐ リポ 59

web3-polymarket

Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。

by elophanto
汎用その他⭐ リポ 52

ethskills

Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。

by jiayaoqijia
汎用その他⭐ リポ 44

xxyy-trade

このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。

by Jimmy-Holiday
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: giuseppe-trisciuoglio · giuseppe-trisciuoglio/developer-kit · ライセンス: MIT