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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:47:31