You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:41:12