如何为无validatedBy类的自定义ValidChars校验注解编写JUnit测试
如何为组合校验注解ValidChars编写JUnit测试
你的ValidChars是一个组合校验注解,通过@ConstraintComposition(AND)把@NotNull和@Pattern两个内置校验规则组合到一起,所以不需要指定validatedBy实现类——校验逻辑会由Hibernate Validator这类JSR-380(Bean Validation)实现框架自动处理。
下面是具体的JUnit测试方案:
1. 准备测试依赖
确保项目中引入Junit 5和Hibernate Validator依赖(Maven示例):
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>8.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>8.0.1.Final</version> </dependency>
2. 创建测试用实体类
定义包含@ValidChars注解字段的实体:
public class TestEntity { @ValidChars private String code; public TestEntity(String code) { this.code = code; } public String getCode() { return code; } }
3. 编写JUnit测试类
通过Bean Validation的Validator实例执行校验,覆盖所有校验场景:
import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class ValidCharsTest { private static Validator validator; @BeforeAll static void setUp() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); } @Test void testValidCode() { TestEntity entity = new TestEntity("ABCD"); var violations = validator.validate(entity); assertTrue(violations.isEmpty()); } @Test void testNullCode() { TestEntity entity = new TestEntity(null); var violations = validator.validate(entity); assertFalse(violations.isEmpty()); assertEquals("must not be null", violations.iterator().next().getMessage()); } @Test void testInvalidLengthCode() { TestEntity entity = new TestEntity("ABC"); var violations = validator.validate(entity); assertFalse(violations.isEmpty()); assertEquals("Invalid", violations.iterator().next().getMessage()); } @Test void testLowerCaseCode() { TestEntity entity = new TestEntity("abcd"); var violations = validator.validate(entity); assertFalse(violations.isEmpty()); assertEquals("Invalid", violations.iterator().next().getMessage()); } }
测试逻辑说明
testValidCode: 校验符合规则的4位大写字母,预期无校验错误testNullCode: 校验空值,触发@NotNull的校验提示testInvalidLengthCode: 校验长度不足4位的字符串,触发@Pattern的自定义错误信息testLowerCaseCode: 校验小写字母字符串,触发@Pattern的自定义错误信息
内容的提问来源于stack exchange,提问作者Somjit
相关产品推荐
相关产品推荐

