JUnit测试中@NotNull字段为Null触发空指针异常该如何解决?
问题解决思路
你遇到的NullPointerException并非来自JSR-380(javax.validation)的校验注解,而是Lombok生成的Setter方法自带的非空检查导致的——它会在你调用setEndDate(null)时直接抛出NPE,抢在参数校验逻辑执行前中断流程。以下是具体解决方法:
1. 排查并移除Lombok的@NonNull注解
检查你的endDate字段,确认是否不小心添加了Lombok的@lombok.NonNull注解(注意和JSR-380的@javax.validation.constraints.NotNull是两个完全不同的注解)。如果存在,直接删除该注解:
// 错误写法:混用了Lombok的@NonNull @lombok.NonNull @NotNull @NotEmpty @Pattern(regexp = Constants.REGEX_CHART_CONDITION_DATE) private String endDate; // 正确写法:只保留JSR-380校验注解 @NotNull @NotEmpty @Pattern(regexp = Constants.REGEX_CHART_CONDITION_DATE) private String endDate;
删除后,Lombok生成的Setter方法不会再做非空判断,参数校验逻辑会正常触发并抛出你预期的CommonException。
2. 调整Lombok全局配置(若全局开启了非空检查)
如果项目通过lombok.config文件全局强制开启了Setter非空检查,修改配置文件:
在项目根目录的lombok.config中添加或修改以下配置:
# 关闭全局Setter非空检查的强制要求 lombok.nonNull.flagUsage=warn # 或者将非空异常类型改为符合校验框架的类型 lombok.nonNull.exceptionType=JAVAX_VALIDATION
3. 测试场景下的临时绕过方案
如果仅为测试需求,不想修改实体类或全局配置,可以通过反射直接为字段赋值,跳过Lombok生成的Setter:
ChartDataSearchCondition condition = new ChartDataSearchCondition(); // 反射赋值endDate为null Field endDateField = ChartDataSearchCondition.class.getDeclaredField("endDate"); endDateField.setAccessible(true); endDateField.set(condition, null); // 设置其他必填字段 condition.setStartDate("2024-01-01"); condition.setColumns(Arrays.asList("col1")); // 执行校验逻辑
4. 确保校验逻辑正确触发
最后确认业务代码中已正确启用JSR-380校验:
- Controller层方法参数添加
@Valid或@Validated注解; - 服务层手动调用校验器(若需要):
Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<ChartDataSearchCondition>> violations = validator.validate(condition); if (!violations.isEmpty()) { throw new CommonException(ErrorCodes.VALIDATION_FAILED, violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(","))); }
内容的提问来源于stack exchange,提问作者Nghihoang
相关产品推荐
相关产品推荐

