unit-test-bean-validation
Jakarta Bean Validation(JSR-380)のユニットテストパターンを提供し、`@Valid`・`@NotNull`・`@Min`・`@Max`・`@Email` などの制約をHibernate Validatorで検証します。カスタムバリデーターのテスト、制約違反のアサーション、バリデーショングループ、パラメータ化テストのコード生成に対応し、Springコンテキスト不要でデータ整合性ロジックを検証できます。バリデーションテストやカスタム制約バリデーターのテストを記述する際にご利用ください。
description の原文を見る
Provides patterns for unit testing Jakarta Bean Validation (JSR-380), including @Valid, @NotNull, @Min, @Max, @Email constraints with Hibernate Validator. Generates custom validator tests, constraint violation assertions, validation groups, and parameterized validation tests. Validates data integrity logic without Spring context. Use when writing validation tests, bean validation tests, or testing custom constraint validators.
SKILL.md 本文
Jakarta Bean Validation のユニットテスト
概要
このスキルは、JUnit 5 を使用した Jakarta Bean Validation アノテーションとカスタムバリデータのユニットテスト用の実行可能なパターンを提供します。組み込み制約(@NotNull、@Email、@Min、@Max、@Size)、カスタム @Constraint 実装、クロスフィールドバリデーション、バリデーショングループに対応。テストは Spring コンテキストなしで独立して実行されます。
使用場面
- Jakarta Bean Validation または JSR-380 制約のユニットテストを作成する場合
- カスタム
@Constraintバリデータと制約違反メッセージをテストする場合 - DTO およびリクエストオブジェクト内のBean バリデーションロジックをテストする場合
- クロスフィールドバリデーション(例:パスワードの一致確認)を検証する場合
- バリデーショングループを使用した条件付きバリデーションをテストする場合
- Spring Boot コンテキストなしで高速なバリデーションテストを実行する場合
手順
- 依存関係を追加: テストスコープで
jakarta.validation-apiとhibernate-validatorを含める - 基本テストクラスを作成:
@BeforeEachでValidation.buildDefaultValidatorFactory()を使用してValidatorを一度だけビルド - 有効なケースをテストする: 制約違反なしでオブジェクトがパスすることを確認
- 無効なケースをテストする: 制約違反に正しいプロパティパスとメッセージが含まれていることをアサート
- 違反詳細を抽出:
getPropertyPath()、getMessage()、getInvalidValue()を使用 - カスタムバリデータをテスト: パターンについては
references/custom-validators.mdを参照 - パラメータ化テストを使用:
@ParameterizedTestで複数の入力を効率的にテスト - バリデーションテストをグループ化: 条件付きルール用にバリデーショングループを使用(
references/advanced-patterns.mdを参照)
例
Maven セットアップ
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
共通テストセットアップ
import jakarta.validation.*;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.path.Path;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
class BaseValidationTest {
protected Validator validator;
@BeforeEach
void setUpValidator() {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
}
基本的な制約のテスト
class UserDtoTest extends BaseValidationTest {
@Test
void shouldPassValidationWithValidUser() {
UserDto user = new UserDto("Alice", "alice@example.com", 25);
assertThat(validator.validate(user)).isEmpty();
}
@Test
void shouldFailWhenNameIsNull() {
UserDto user = new UserDto(null, "alice@example.com", 25);
assertThat(validator.validate(user))
.extracting(ConstraintViolation::getMessage)
.contains("must not be blank");
}
@Test
void shouldFailWhenEmailIsInvalid() {
UserDto user = new UserDto("Alice", "invalid-email", 25);
Set<ConstraintViolation<UserDto>> violations = validator.validate(user);
assertThat(violations)
.extracting(ConstraintViolation::getPropertyPath)
.extracting(Path::toString)
.contains("email");
}
@Test
void shouldFailWhenAgeIsBelowMinimum() {
UserDto user = new UserDto("Alice", "alice@example.com", -1);
assertThat(validator.validate(user))
.extracting(ConstraintViolation::getMessage)
.contains("must be greater than or equal to 0");
}
@Test
void shouldFailWhenMultipleConstraintsViolated() {
UserDto user = new UserDto(null, "invalid", -5);
assertThat(validator.validate(user)).hasSize(3);
}
}
カスタムバリデータのテスト
カスタム制約パターンについては、references/custom-validators.md を参照してください:
@Constraintアノテーションの作成ConstraintValidatorの実装- クロスフィールドバリデーション(パスワードの一致確認)
- ステートレスバリデータのベストプラクティス
バリデーショングループのテスト
バリデーショングループとパラメータ化テストについては、references/advanced-patterns.md を参照してください:
- バリデーショングループインターフェースの定義
groupsパラメータによる条件付きバリデーション@ParameterizedTestと@ValueSourceおよび@CsvSourceの使用- 失敗したバリデーションテストのデバッグ
ベストプラクティス
- 有効と無効の両方をテスト: 各制約は成功ケースと失敗ケースの両方をテストが必要
- 違反詳細をアサート: プロパティパス、メッセージ、制約タイプを検証
- エッジケースをテスト: null、空文字列、ホワイトスペースのみ、境界値
- バリデータをステートレスに保つ: カスタムバリデータは状態を保持してはいけません
- 明確なメッセージを使用: 制約メッセージはユーザーフレンドリーである必要があります
- 関連テストをグループ化:
BaseValidationTestを拡張してバリデータセットアップを共有 - エラーメッセージをテスト: メッセージが要件と一致することを確認
よくある落とし穴
- null 値のテストを忘れる(ほとんどの制約はデフォルトで null を無視)
- 制約違反でプロパティパスを検証しない
- ユニットレベルではなくサービス/コントローラレベルでバリデーションをテストする
- 過度に複雑なカスタムバリデータを作成する
- 必須フィールドに対して
@NotNullと他の制約の組み合わせを見逃す
制約と警告
- Null 処理: ほとんどの制約はデフォルトで null を無視します — 必須フィールドの場合は
@NotNullと他の制約を組み合わせてください - スレッドセーフ:
Validatorインスタンスはスレッドセーフで、共有できます - メッセージローカライズ: i18n が必要な場合は、異なるロケールでテストしてください
- カスケードバリデーション: ネストされたオブジェクトで再帰的バリデーションを行うには
@Validを使用 - カスタムバリデータ: ステートレスである必要があり、null 値に対して
trueを返す必要があります - テスト分離: バリデーションユニットテストは Spring コンテキストやデータベースに依存してはいけません
トラブルシューティング
ValidatorFactory が見つからない: jakarta.validation-api と hibernate-validator がテストクラスパス上にあることを確認してください。
カスタムバリデータが呼び出されない: @Constraint(validatedBy = YourValidator.class) アノテーションが正しいことを確認してください。
Null 値がバリデーション をパスする: これは期待される動作です — @NotNull が存在しない限り、制約は null を無視します。
違反数が間違っている: hasSize() で正確な数を検証し、オブジェクト内のすべてのフィールドをチェックしてください。
プロパティパスが正しくない: ゲッター(メソッド)ではなく、フィールドに制約アノテーションが付いていることを確認してください。
参考資料
- Jakarta Bean Validation 仕様
- Hibernate Validator
- カスタムバリデータとクロスフィールドバリデーション:
references/custom-validators.md - バリデーショングループとパラメータ化テスト:
references/advanced-patterns.md
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- giuseppe-trisciuoglio
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/giuseppe-trisciuoglio/developer-kit / ライセンス: MIT
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。