You need to enable JavaScript to run this app. 如何使用AssertJ测试属性赋值触发的ConstraintViolationException异常
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AssertJ测试属性赋值触发的ConstraintViolationException异常

解决方案

前置配置(Setter触发校验的前提)

默认情况下仅给类加@Validated和字段校验注解,Lombok自动生成的Setter不会自动触发参数校验,你需要修改Lombok注解配置,把校验规则绑定到生成的Setter方法上:

@Data
@Validated
@EqualsAndHashCode(callSuper = true)
@Document(collection = "Xxx")
public class XxxDocument extends Zzz {
    @Min(0)
    @Max(255)
    @Setter(onMethod_ = {@Validated}) // 将校验注解绑定到Lombok生成的Setter方法上,触发方法级校验
    private Integer aProperty;
}

如果是Spring环境下的托管Bean,完成上述配置后调用Setter时参数不符合要求就会抛出ConstraintViolationException。

AssertJ测试写法

Spring环境测试写法

import jakarta.validation.ConstraintViolationException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
public class XxxDocumentTest {

    @Autowired
    private XxxDocument xxxDocument;

    @Test
    void aProperty赋值超出最大值时抛出校验异常() {
        assertThatThrownBy(() -> xxxDocument.setAProperty(300))
                .isInstanceOf(ConstraintViolationException.class)
                .hasMessageContaining("aProperty");
    }

    @Test
    void aProperty赋值小于最小值时抛出校验异常() {
        assertThatThrownBy(() -> xxxDocument.setAProperty(-1))
                .isInstanceOf(ConstraintViolationException.class);
    }

    @Test
    void aProperty赋值合法时无异常() {
        xxxDocument.setAProperty(100);
        assertThat(xxxDocument.getAProperty()).isEqualTo(100);
    }
}

非Spring环境测试写法

如果没有Spring托管,你需要手动调用校验器实现校验,AssertJ断言写法如下:

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.assertj.core.api.Assertions.assertThat;

public class XxxDocumentNonSpringTest {
    private static Validator validator;

    @BeforeAll
    static void initValidator() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        validator = factory.getValidator();
    }

    @Test
    void aProperty赋值非法时存在校验违规记录() {
        XxxDocument document = new XxxDocument();
        document.setAProperty(300);
        var violations = validator.validate(document);
        assertThat(violations).isNotEmpty();
        assertThat(violations).anyMatch(v -> v.getPropertyPath().toString().equals("aProperty"));
    }
}

内容的提问来源于stack exchange,提问作者du-it

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 17:24:04