К основному содержанию
скилл CX Codex

unit-test-bean-validation — скилл для Claude Code: обзор и запуск

Скилл помогает писать изолированные тесты для Jakarta Bean Validation на JUnit 5 без запуска Spring. Пригодится при проверке DTO и кастомных валидаторов.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-bean-validation -a claude-code
Открыть на GitHub

Что делает unit-test-bean-validation

Скилл даёт готовые шаблоны для юнит-тестирования ограничений JSR-380 (@NotNull, @Size, @Email, @Min, @Max) и кастомных реализаций @Constraint. Тесты выполняются изолированно через чистый JUnit 5 и Validation.buildDefaultValidatorFactory(). Spring контекст для них не поднимается.

Внутри заложены примеры базового тестового класса, параметризованных проверок через @ParameterizedTest и работы с группами валидации. Скилл учит извлекать детали из ConstraintViolation, включая путь к свойству через getPropertyPath(), невалидное значение и текст ошибки.

Для запуска нужны зависимости jakarta.validation-api и hibernate-validator в тестовом скоупе. Большинство стандартных ограничений по спецификации игнорируют null. Поэтому отсутствие @NotNull рядом с @Email или @Min пропустит пустые значения, и тесты на валидность упадут при первой же ошибке в логике DTO.

Какие задачи решает

  • Проверить валидацию DTO без медленного запуска Spring Boot
  • Написать тесты для кастомных валидаторов @Constraint и проверки совпадения полей
  • Протестировать группы валидации и граничные значения через @ParameterizedTest
  • Проверить текст ошибки и путь свойства в ConstraintViolation

Примеры запросов агенту

  • Напиши юнит-тест на JUnit 5 для проверки аннотаций @NotNull и @Email в UserDto
  • Сгенерируй тест для кастомного валидатора паролей с проверкой текста ConstraintViolation

Как установить unit-test-bean-validation

1Через Skills CLI (Vercel)

npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-bean-validation -a claude-code

2Вручную: положить файлы

~/.claude/skills/unit-test-bean-validation/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/unit-test-bean-validation/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора92

shadcn-ui Скилл подсказывает агенту, как ставить и настраивать компоненты shadcn/ui: кнопки, диалоги, таблицы, формы с React Hook Form и Zod. CX Codex +1 22 400установок tailwind-css-patterns Скилл с готовыми паттернами Tailwind CSS: адаптивные сетки, карточки, формы, тёмная тема. Пригодится, когда агент верстает компоненты на React, Vue или Svelte. CX Codex +1 17 700установок drizzle-orm-patterns Помогает писать типобезопасные схемы, запросы и миграции на Drizzle ORM. Пригодится при работе с таблицами, связями и транзакциями. CX Codex +1 5 400установок nextjs-performance Скилл по оптимизации Next.js: Core Web Vitals, картинки и шрифты, кеширование, стриминг, размер бандла. Пригодится, когда сайт тормозит и надо понять, с чего начать. CX Codex +1 4 900установок react-patterns Подсказывает агенту паттерны React 19: Server Components, Server Actions, useOptimistic, Suspense. Пригодится, когда пишете приложение на Next.js App Router. CX Codex +1 4 800установок tailwind-design-system Скилл помогает развернуть дизайн-систему на Tailwind CSS v4.1+ и shadcn/ui. Он настраивает токены в формате oklch, CSS-переменные и обёртки над базовыми компонентами. CX Codex +1 4 500установок spring-boot-test-patterns Скилл подсказывает агенту, как писать тесты Spring Boot: юнит-тесты с Mockito, срезы @DataJpaTest и @WebMvcTest, интеграционные с Testcontainers. CX Codex +1 4 300установок react-code-review Скилл проверяет React-компоненты и хуки перед мержем: архитектура, зависимости в useEffect, доступность, типы. Полезен, когда правки уже готовы и нужен разбор по серьёзности. CX Codex +1 4 300установок

Похожие

303-frameworks-spring-boot-validation Juan Antonio Breña Moral Скилл для ИИ-агента, который наводит порядок в валидации Spring Boot: Bean Validation на DTO, @Valid на границах API, группы ограничений и единый формат ошибок 400. CX Codex +1 303установок 131-java-testing-unit-testing Juan Antonio Breña Moral Скилл помогает писать и рефакторить модульные тесты на Java по стандартам JUnit 5, AssertJ и Mockito. Он находит антипаттерны вроде общего состояния и проверяет граничные условия. CX Codex +1 449установок dart-add-unit-test dart-lang Пишет unit-тесты на Dart и Flutter через package:test: раскладывает файлы по test/, добавляет моки и гоняет прогон до зелёного. CX Codex +1 19 200установок unit-test-vue-pinia официальный github Помогает писать и проверять юнит-тесты для Vue 3, TypeScript, Vitest и Pinia. Пригодится, когда тесты уже есть, но лезут во внутренности компонентов. 1 800установок adding-dbt-unit-test dbt-labs Пишет YAML-определения юнит-тестов для моделей dbt: подставляет моковые входные данные и проверяет ожидаемый результат. CX Codex +1 1 100установок Python Unit Test Generator — Comprehensive, Coverage-Mapped & Production-Ready sivasaiyadav8143 Промпт превращает кусок Python-кода в готовый набор юнит-тестов на pytest с картой покрытия и моками внешних зависимостей. GP ChatGPT ★ 174 597звёзд репо

Рядом в теме «Бэкенд и API»

Всё по теме «Бэкенд и API» →

Вопросы о unit-test-bean-validation

Как установить unit-test-bean-validation в Claude Code?

Выполните команду npx skills add giuseppe-trisciuoglio/developer-kit --skill unit-test-bean-validation -a claude-code. Также можно сохранить файл скилла по пути ~/.claude/skills/unit-test-bean-validation/SKILL.md.

Зачем нужен скилл unit-test-bean-validation?

Он генерирует изолированные юнит-тесты для аннотаций Jakarta Bean Validation. Это позволяет быстро проверять DTO без загрузки базы данных и контекста Spring.

Какие зависимости нужны проекту для работы таких тестов?

В тестовый скоуп сборщика нужно добавить jakarta.validation-api и реализацию hibernate-validator. Для удобных проверок утверждений скилл использует assertj-core.

Исходный текст

SKILL.md · MIT
---
name: unit-test-bean-validation
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.
allowed-tools: Read, Write, Bash, Glob, Grep
---

# Unit Testing Jakarta Bean Validation

## Overview

This skill provides executable patterns for unit testing Jakarta Bean Validation annotations and custom validators using JUnit 5. Covers built-in constraints (`@NotNull`, `@Email`, `@Min`, `@Max`, `@Size`), custom `@Constraint` implementations, cross-field validation, and validation groups. Tests run in isolation without Spring context.

## When to Use

- Writing unit tests for Jakarta Bean Validation or JSR-380 constraints
- Testing custom `@Constraint` validators and constraint violation messages
- Testing bean validation logic in DTOs and request objects
- Verifying cross-field validation (e.g., password matching)
- Testing conditional validation with validation groups
- Fast validation tests without Spring Boot context

## Instructions

1. **Add dependencies**: Include `jakarta.validation-api` and `hibernate-validator` in test scope
2. **Create base test class**: Build `Validator` once in `@BeforeEach` using `Validation.buildDefaultValidatorFactory()`
3. **Test valid cases first**: Verify objects pass without violations
4. **Test invalid cases**: Assert constraint violations include correct property path and message
5. **Extract violation details**: Use `getPropertyPath()`, `getMessage()`, `getInvalidValue()`
6. **Test custom validators**: See `references/custom-validators.md` for patterns
7. **Use parameterized tests**: Test multiple inputs efficiently with `@ParameterizedTest`
8. **Group validation tests**: Use validation groups for conditional rules (see `references/advanced-patterns.md`)

## Examples

### Maven Setup

```xml
<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>
```

### Common Test Setup

```java
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();
  }
}
```

### Testing Basic Constraints

```java
class UserDtoTest extends BaseValidationTest {

  @Test
  void shouldPassValidationWithValidUser() {
    UserDto user = new UserDto("Alice", "[email protected]", 25);
    assertThat(validator.validate(user)).isEmpty();
  }

  @Test
  void shouldFailWhenNameIsNull() {
    UserDto user = new UserDto(null, "[email protected]", 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", "[email protected]", -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);
  }
}
```

### Testing Custom Validators

For custom constraint patterns, see `references/custom-validators.md`:
- Creating `@Constraint` annotations
- Implementing `ConstraintValidator`
- Cross-field validation (password matching)
- Stateless validator best practices

### Testing Validation Groups

For validation groups and parameterized tests, see `references/advanced-patterns.md`:
- Defining validation group interfaces
- Conditional validation with `groups` parameter
- `@ParameterizedTest` with `@ValueSource` and `@CsvSource`
- Debugging failed validation tests

## Best Practices

- **Test both valid and invalid**: Every constraint needs both passing and failing test cases
- **Assert violation details**: Verify property path, message, and constraint type
- **Test edge cases**: null, empty string, whitespace-only, boundary values
- **Keep validators stateless**: Custom validators must not maintain state
- **Use clear messages**: Constraint messages should be user-friendly
- **Group related tests**: Extend `BaseValidationTest` to share validator setup
- **Test error messages**: Ensure messages match requirements

## Common Pitfalls

- Forgetting to test null values (most constraints ignore null by default)
- Not verifying the property path in constraint violations
- Testing validation at service/controller level instead of unit level
- Creating overly complex custom validators
- Missing `@NotNull` for mandatory fields combined with other constraints

## Constraints and Warnings

- **Null handling**: Most constraints ignore null by default — combine `@NotNull` with other constraints for mandatory fields
- **Thread safety**: `Validator` instances are thread-safe and can be shared
- **Message localization**: Test with different locales if i18n is required
- **Cascading validation**: Use `@Valid` on nested objects for recursive validation
- **Custom validators**: Must be stateless and return `true` for null values
- **Test isolation**: Validation unit tests should not depend on Spring context or database

## Troubleshooting

**ValidatorFactory not found**: Ensure `jakarta.validation-api` and `hibernate-validator` are on test classpath.

**Custom validator not invoked**: Verify `@Constraint(validatedBy = YourValidator.class)` annotation is correct.

**Null values pass validation**: This is expected behavior — constraints ignore null unless `@NotNull` is present.

**Wrong violation count**: Use `hasSize()` to verify exact count, check all fields in the object.

**Property path incorrect**: Ensure the field, not the getter, has the constraint annotation.

## References

- [Jakarta Bean Validation Spec](https://jakarta.ee/specifications/bean-validation/)
- [Hibernate Validator](https://hibernate.org/validator/)
- Custom validators and cross-field validation: `references/custom-validators.md`
- Validation groups and parameterized tests: `references/advanced-patterns.md`

© giuseppe-trisciuoglio · MIT · giuseppe-trisciuoglio/developer-kit

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой