研发协作
用 JUnit 5 单元测试 Jakarta Bean…
在编写 DTO/请求对象的 Bean Validation 单元测试、自定义 @Constraint 校验器测试或跨字段校验测试时,用纯 JUnit 5 + Hibernate Validator 快速验证约束违规。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 JUnit 5 单元测试 Jakar通用
解决思路
- 在测试作用域添加依赖:jakarta.validation-api、hibernate-validator,以及 assertj-core(test scope)。
- 创建基础测试类:在 @BeforeEach 中用 Validation.buildDefaultValidatorFactory().getValidator() 构建一次 Validator 实例。
- 先测试合法用例:验证对象通过校验且无违规(assertThat(validator.validate(obj)).isEmpty())。
- 再测试非法用例:断言约束违规包含正确的 property path 与 message。
- 提取违规细节:使用 getPropertyPath()、getMessage()、getInvalidValue() 进行断言。
- 测试自定义校验器:参考 references/custom-validators.md 中的模式(创建 @Constraint 注解、实现 ConstraintValidator、跨字段校验如密码匹配、无状态校验器最佳实践)。
- 使用参数化测试:用 @ParameterizedTest 配合 @ValueSource、@CsvSource 高效测试多组输入。
- 分组校验测试:使用 validation groups 处理条件规则(参考 references/advanced-patterns.md)。
- 每个约束都要同时覆盖通过和失败两种测试用例。
- 断言违规详情:验证 property path、message 和约束类型。
- 测试边界情况:null、空字符串、仅空白字符、边界值。
- 保持校验器无状态:自定义校验器不得维护状态。
- 使用清晰的消息:约束消息应对用户友好。
- 分组相关测试:继承 BaseValidationTest 以共享 validator 初始化。
- 测试错误消息:确保消息符合需求。
- 注意 null 处理:大多数约束默认忽略 null,必填字段需同时加 @NotNull。
- Validator 实例线程安全,可共享使用。
- 如需 i18n,用不同 locale 测试消息本地化。
- 嵌套对象递归校验时在字段上使用 @Valid 级联校验。
- 自定义校验器必须无状态,且对 null 值返回 true。
- 校验单元测试不应依赖 Spring 上下文或数据库,保持测试隔离。
- 若 ValidatorFactory not found,确认 jakarta.validation-api 与 hibernate-validator 在测试 classpath 上。
- 若自定义校验器未被调用,检查 @Constraint(validatedBy = YourValidator.class) 注解是否正确。
- 若 null 值通过校验,这是预期行为——除非存在 @NotNull,否则约束忽略 null。
- 若违规数量不对,用 hasSize() 验证精确数量并检查对象所有字段。
- 若 property path 不正确,确保约束注解加在字段上而非 getter 上。
适用边界 · 注意事项
- 需要验证 Spring 上下文相关的校验逻辑(如 @Validated 在 Controller/Service 层的集成行为)时。
- 需要测试数据库约束或持久层校验时。
- 需要测试依赖外部服务或复杂运行时环境的校验时。