java-unit-test
为 Java 项目生成自动化单元测试(JUnit 5 + Mockito)。当用户要求编写单元测试、生成测试用例或提升测试覆盖率时使用。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o java-unit-test.zip https://jpskill.com/download/19138.zip && unzip -o java-unit-test.zip && rm java-unit-test.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/19138.zip -OutFile "$d\java-unit-test.zip"; Expand-Archive "$d\java-unit-test.zip" -DestinationPath $d -Force; ri "$d\java-unit-test.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
java-unit-test.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
java-unit-testフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
[Skill 名] java-unit-test
Java単体テストスキル
トリガー条件
ユーザーが以下の要求(同義表現を含む)を提示した場合に、このスキルをアクティブ化します。
- 単体テストを書いてください / このクラスのテストを書いてください / テストケースを生成してください
- テストカバレッジを向上させてください / テストを補完してください / カバレッジが基準を満たしていません
- junit test / mockito test / unit test
事前チェックリスト
テストコードを生成する前に、以下のチェックと情報収集を完了する必要があります(不足している場合は、まず補完してください)。
1) テスト対象クラス(SUT)の特定
- テスト対象クラスのソースファイルとその直接的な依存関係(コンストラクタパラメータ、フィールドインジェクション、静的依存関係)を読み取ります。
- パッケージ名、クラス名、可視性、コンストラクタ、すべての public メソッドシグネチャを記録します。
2) クラス構造と動作の分析
- public メソッドを一つずつ整理します。
- 入力パラメータ、戻り値、スローされる例外
- 分岐条件と境界値(null/空のコレクション/0/負数/超長文字列など)
- 外部との相互作用:データベース/キャッシュ/HTTP/RPC/ファイル/時間/乱数など
3) 依存関係と Mock 可能な点の特定
- 置換可能な依存関係(インターフェース/コンポーネント/DAO/Client)を特定し、Mock/Spy の対象を明確にします。
- Mock できない、または Mock が難しい点(static/final/private/new で生成されるオブジェクト)をマークします。
4) テストプロジェクトとフレームワークの制約の確認
- プロジェクトで使用されているテストフレームワークとバージョン(JUnit 4/5、Mockito、Spring Testなど)を確認します。
- テストソースのディレクトリ構造(例:src/test/java とパッケージパスが一致しているか)を確認します。
- アサーションライブラリとスタイル(JUnit Assertions / AssertJ / Hamcrest など、プロジェクトの現状に優先して従います)を確認します。
テストコード生成の規範
1) テストクラス命名規範
- テストクラス名:{テスト対象クラス名}Test
- 複数の実装または複数のシナリオに分割されている場合:{テスト対象クラス名}{シナリオ}Test(例:OrderServiceCreateTest)
2) Import 宣言規範
- 以下の順序で import を整理します。
- java.*
- javax.*
- サードパーティライブラリ(org. / com.)
- プロジェクト内部パッケージ
- static import(アサーション、Mockito 静的メソッド)
- 未使用の import は禁止です。
3) テストクラス構造テンプレート
- 統一された構造:
- Mock 宣言領域
- テスト対象オブジェクト構築領域(例:@InjectMocks または手動での new)
- 共通テストデータ構築メソッド(オプション)
- ユースケース領域:テスト対象メソッドごとにグループ化
推奨される骨格(プロジェクトフレームワークに応じていずれかを選択):
-
純粋な Mockito(優先):
- @ExtendWith(MockitoExtension.class)
- @Mock 依存関係
- @InjectMocks テスト対象オブジェクト(またはコンストラクタインジェクションによる手動 new)
-
Spring が関与する場合(プロジェクトにこのスタイルが既にあり、かつ必要不可欠な場合のみ):
- @SpringBootTest / @ExtendWith(SpringExtension.class)
- @MockBean で外部依存関係を置き換え
4) Mock オブジェクト設定規範
- Mock の動作は「最小限の必要性」の原則に従います。現在のユースケースに必要な呼び出しのみをスタブします。
- 外部依存関係との相互作用は検証(verify)する必要があります。
- 呼び出されたかどうか
- 呼び出し回数(times / never)
- 重要な入力パラメータ(ArgumentCaptor または eq)
- 実装の詳細を過度に検証しないでください(脆弱なテストを避けるため)。
5) テストデータ構築規範
- プロジェクトに既存の Builder/Factory メソッドがある場合は、それらを使用してテストデータを構築することを優先します。
- Builder がない場合は、専用のプライベートメソッドを使用して一般的なオブジェクトを構築します。
- buildValidXxx()
- buildXxxWithBoundary()
- 単一のテストメソッド内で大量のオブジェクト構築ロジックを積み重ねることを避けます。
6) アサーション規範
- 各テストは、そのシナリオの主要な出力と主要な副作用のみをアサートします。
- アサーションの優先順位:
- ビジネスの戻り値/状態
- 外部依存関係との相互作用(verify)
- 生成された永続化/イベント(もしあれば)
7) 例外と境界ユースケース規範
- 不正なパラメータ、依存関係の例外、null/空のコレクションを返すシナリオは必ずカバーする必要があります。
- 例外アサーションには assertThrows を使用し、例外メッセージまたはエラーコード(安定している場合)を検証します。
8) パラメータ化テスト(オプション)
- 複数の同等な入力の組み合わせがあり、アサーションが同じである場合は、パラメータ化テストを優先します。
- プロジェクトが JUnit 5 のパラメータ化サポートを既に利用している場合にのみ有効にします。
テストケース設計原則
1) カバレッジ戦略
- public メソッドの以下をカバーします。
- 正常なフロー(Happy Path)
- 主要な分岐(if/else、switch、early return)
- 境界条件(境界値、null値、極端な値)
- 例外フロー(依存関係のエラー、ビジネス検証の失敗)
2) テストピラミッド
- 単体テストは純粋なビジネスロジックと境界条件を優先してカバーします。
- 結合テストは主要な経路と契約のみをカバーします(このスキルは単体テストに重点を置いています)。
3) カバレッジ目標(チームの要求に応じて調整)
- 保守性を優先し、主要なロジックと高リスクモジュールをカバーします。
- 「薄いラッパー/純粋な転送」コードに対しては、カバレッジを過度に追求しません。
ベストプラクティスチェックリスト
命名チェックリスト
- テストメソッド名には、メソッド名 + シナリオ + 期待される結果を含めます。
- 命名スタイルを統一します(いずれかを選択し、一貫性を保ちます)。
- shouldXxxWhenYyy
- givenYyyWhenXxxThenZzz
構造チェックリスト
- Arrange / Act / Assert の三段構成を明確にします。
- 単体テストは実行順序に依存せず、繰り返し実行可能です。
- 単体テストは実際の時間/乱数に依存しません(必要に応じて Clock/Random を注入するか、ラップします)。
アサーションチェックリスト
- アサーションはできるだけ具体的にし、「只 assertNotNull」のような弱いアサーションは避けます。
- コレクション/オブジェクトのアサーションでは、主要なフィールドに注目し、全量オブジェクトのアサートによる脆弱性を避けます。
Mock チェックリスト
- deep stubs は避けます。
- プライベートメソッドのテストは避けます(外部から観測可能な動作をテストします)。
パフォーマンスチェックリスト
- 単体テストは高速であるべきです(通常ミリ秒単位)。
- スレッドスリープ、実際の IO、ネットワークリクエストは避けます。
よくある質問と解決策
1) 静的メソッドの Mock が難しい
- 優先的にリファクタリングします。注入可能な依存関係で静的呼び出しをラップします。
- プロジェクトが Mockito inline などの機能を既に有効にしている場合にのみ、静的 Mock を検討します(慎重に使用してください)。
2) final クラス/メソッドの Mock の問題
- 優先的にプロジェクトの既存の Mockito 設定に従います。必要に応じて Mockito inline を使用します。
3) プライベートメソッドをどのようにテストするか
- プライベートメソッドを直接テストしません。public メソッドの入出力と副作用を通じてそのロジックをカバーします。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Java Unit Test Skill
触发条件
当用户提出以下需求时激活本技能(包含同义表达):
- 帮我写单元测试 / 为这个类写测试 / 生成测试用例
- 提升测试覆盖率 / 补齐测试 / 覆盖率不达标
- junit test / mockito test / unit test
前置检查清单
在生成测试代码前,必须完成以下检查与信息收集(缺失则先补齐):
1) 识别被测类(SUT)
- 读取被测类源文件与其直接依赖(构造参数、字段注入、静态依赖)
- 记录包名、类名、可见性、构造方法、所有 public 方法签名
2) 分析类结构与行为
- 逐个梳理 public 方法:
- 入参、返回值、抛出异常
- 分支条件与边界值(null/空集合/0/负数/超长字符串等)
- 外部交互:数据库/缓存/HTTP/RPC/文件/时间/随机数等
3) 识别依赖与可 Mock 点
- 识别可替换依赖(接口/组件/DAO/Client),明确 Mock/Spy 的对象
- 标记不可 Mock 或较难 Mock 的点(static/final/private/new 出来的对象)
4) 确认测试工程与框架约束
- 确认项目使用的测试框架与版本(JUnit 4/5,Mockito,Spring Test 等)
- 确认测试源码目录结构(例如:src/test/java 与包路径对齐)
- 确认断言库与风格(JUnit Assertions / AssertJ / Hamcrest 等,优先跟随项目现状)
测试代码生成规范
1) 测试类命名规范
- 测试类名:{被测类名}Test
- 若存在多实现或多场景拆分:{被测类名}{场景}Test(例如:OrderServiceCreateTest)
2) Import 声明规范
- 按以下顺序组织 import:
- java.*
- javax.*
- 第三方库(org. / com.)
- 项目内部包
- static import(断言、Mockito 静态方法)
- 禁止未使用 import
3) 测试类结构模板
- 统一结构:
- Mock 声明区
- 被测对象构建区(如 @InjectMocks 或手动 new)
- 通用测试数据构建方法(可选)
- 用例区:按被测方法分组
推荐的骨架(根据项目框架选择其一):
-
纯 Mockito(优先):
- @ExtendWith(MockitoExtension.class)
- @Mock 依赖
- @InjectMocks 被测对象(或构造注入手动 new)
-
Spring 参与(仅当项目已有此风格且确有必要):
- @SpringBootTest / @ExtendWith(SpringExtension.class)
- @MockBean 替换外部依赖
4) Mock 对象配置规范
- Mock 行为遵循 “最小必要” 原则:只 stub 当前用例需要的调用
- 对外部依赖交互必须验证(verify):
- 是否被调用
- 调用次数(times / never)
- 关键入参(ArgumentCaptor 或 eq)
- 不要过度验证实现细节(避免脆弱测试)
5) 测试数据构建规范
- 优先使用 Builder/Factory 方法构建测试数据(若项目已有)
- 没有 Builder 时,使用专用的私有方法构造常见对象:
- buildValidXxx()
- buildXxxWithBoundary()
- 避免在单个测试方法内堆叠大量对象构建逻辑
6) 断言规范
- 每个测试只断言该场景的关键输出与关键副作用
- 断言优先级:
- 业务返回值/状态
- 对外部依赖的交互(verify)
- 产生的持久化/事件(如有)
7) 异常与边界用例规范
- 对非法参数、依赖异常、返回空值/空集合的场景必须覆盖
- 异常断言使用 assertThrows,并校验异常信息或错误码(若稳定)
8) 参数化测试(可选)
- 当存在多个等价输入组合且断言相同,优先使用参数化测试
- 仅在项目已使用 JUnit 5 参数化支持时启用
测试用例设计原则
1) 覆盖策略
- 覆盖 public 方法的:
- 正常流程(Happy Path)
- 关键分支(if/else、switch、early return)
- 边界条件(边界值、空值、极端值)
- 异常流程(依赖抛错、业务校验失败)
2) 测试金字塔
- 单元测试优先覆盖纯业务逻辑与边界条件
- 集成测试只覆盖关键链路与契约(本技能重点在单元测试)
3) 覆盖率目标(按团队要求调整)
- 以可维护性优先,覆盖关键逻辑与高风险模块
- 对“薄封装/纯转发”代码不过度追求覆盖率
最佳实践清单
命名清单
- 测试方法名包含:方法名 + 场景 + 预期结果
- 命名风格统一(可选其一并保持一致):
- shouldXxxWhenYyy
- givenYyyWhenXxxThenZzz
结构清单
- Arrange / Act / Assert 三段式清晰
- 单测不依赖执行顺序,可重复执行
- 单测不依赖真实时间/随机数(必要时注入 Clock/Random 或封装)
断言清单
- 断言尽量具体,避免 “只 assertNotNull” 的弱断言
- 对集合/对象断言关注关键字段,避免断言全量对象导致脆弱
Mock 清单
- 避免 deep stubs
- 避免对私有方法做测试(测试对外可观察行为)
性能清单
- 单测应快速(通常毫秒级)
- 避免线程 sleep、真实 IO、网络请求
常见问题与解决方案
1) 静态方法难以 Mock
- 优先重构:用可注入的依赖封装静态调用
- 若项目已启用 Mockito inline 等能力,再考虑静态 Mock(谨慎使用)
2) final 类/方法 Mock 问题
- 优先遵循项目现有 Mockito 配置;必要时使用 Mockito inline
3) 私有方法怎么测
- 不直接测试私有方法;通过 public 方法的输入输出与副作用覆盖其逻辑