如何使用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
相关产品推荐
相关产品推荐

