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

测试getCarById方法遇NoSuchElementException(无值)异常求助

问题原因及解决方案

问题根源

你在测试代码中调用carService.getCarById(1l)的时机早于Mock行为的配置,导致第一次调用服务方法时,carrepo.findById(1l)没有对应的Mock返回值,默认返回空的Optional,此时调用Optional.get()就会抛出NoSuchElementException(提示"no value present")。

修复步骤

  1. 调整Mock配置与方法调用的顺序:先配置carrepo的Mock行为,再调用服务方法。
  2. 统一Long类型的写法:将1l改为1L(小写l容易和数字1混淆,Java规范推荐用大写L)。

修复后的测试代码:

@Test
void getCarById() {
    Car car = new Car();
    car.setId(1L);

    // 先配置Mock行为
    when(carrepo.findById(1L)).thenReturn(Optional.of(car));
    
    // 再调用服务方法
    Car actualCar = carService.getCarById(1L);
    Assertions.assertEquals(car, actualCar);
}

额外建议(生产代码优化)

服务层直接调用Optional.get()存在风险,如果数据库中确实没有对应ID的记录,生产环境也会抛出同样的异常。建议改为明确的异常抛出,增强代码健壮性:

@Override
public Car getCarById(Long id) {
    return carrepo.findById(id)
            .orElseThrow(() -> new RuntimeException("未找到ID为" + id + "的车辆"));
}

内容的提问来源于stack exchange,提问作者Jcoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:39:36