Agent Skills by ALSEL
Anthropic Claudeデータ・分析⭐ リポ 0品質スコア 50/100

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 コンテキストなしで高速なバリデーションテストを実行する場合

手順

  1. 依存関係を追加: テストスコープで jakarta.validation-apihibernate-validator を含める
  2. 基本テストクラスを作成: @BeforeEachValidation.buildDefaultValidatorFactory() を使用して Validator を一度だけビルド
  3. 有効なケースをテストする: 制約違反なしでオブジェクトがパスすることを確認
  4. 無効なケースをテストする: 制約違反に正しいプロパティパスとメッセージが含まれていることをアサート
  5. 違反詳細を抽出: getPropertyPath()getMessage()getInvalidValue() を使用
  6. カスタムバリデータをテスト: パターンについては references/custom-validators.md を参照
  7. パラメータ化テストを使用: @ParameterizedTest で複数の入力を効率的にテスト
  8. バリデーションテストをグループ化: 条件付きルール用にバリデーショングループを使用(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-apihibernate-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
リポジトリ
giuseppe-trisciuoglio/developer-kit
ライセンス
MIT
最終更新
不明

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

関連スキル

OpenAIデータ・分析⭐ リポ 1,451

hugging-face-trackio

Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。

by gradio-app
汎用データ・分析⭐ リポ 855

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が天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。

by star23
Anthropic Claudeデータ・分析⭐ リポ 380

protein_solubility_optimization

タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。

by SpectrAI-Initiative
Anthropic Claudeデータ・分析⭐ リポ 1,743

research-lookup

Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。

by K-Dense-AI
Anthropic Claudeデータ・分析⭐ リポ 299

tree-formatting

ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。

by majiayu000
汎用データ・分析⭐ リポ 145

querying-indonesian-gov-data

インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。

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