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

Mockito测试JpaRepository save方法返回null导致单元测试失败

问题原因
  • 未对Mock的EnfantRepository的save方法进行打桩配置:Mockito框架中,未手动指定返回逻辑的Mock对象的非void方法,默认会返回对应类型的空值(对象类型返回null,基本类型返回默认值,集合返回空集合),你直接调用enfantRepository.save()没有配置返回值,自然返回null,导致Service层的save方法也返回null。
  • 测试代码存在冗余初始化问题:你已经给enfantRepository字段加了@Mock注解,又手动赋值= mock(EnfantRepository.class),属于重复初始化Mock对象,虽然不是本次问题的直接诱因,但不符合Mockito的最佳实践,可能导致后续Mock行为不符合预期。
  • 测试逻辑缺失调用校验:当前测试只校验了返回值非空,没有验证enfantRepository.save是否被正确调用,不符合单元测试的验证逻辑。
解决方案
  1. 移除冗余的Mock初始化代码,只保留@Mock注解即可:
@Mock
private EnfantRepository enfantRepository;
  1. 对enfantRepository.save方法进行打桩,指定调用后的返回值,在@Test方法开头添加如下代码:
// 构造预期返回的Enfant对象
Enfant expectedEnfant = Enfant.builder().id(1L).build();
// 配置mock行为:当调用save方法传入任意Enfant对象时,返回上面构造的expectedEnfant
Mockito.when(enfantRepository.save(ArgumentMatchers.any(Enfant.class))).thenReturn(expectedEnfant);
  1. 补充调用校验逻辑,验证Repository方法被正确调用,在断言之后添加如下代码:
// 验证save方法被调用了2次(你代码里先后调用了2次enfantService.save)
Mockito.verify(enfantRepository, Mockito.times(2)).save(ArgumentMatchers.any(Enfant.class));

如果不需要重复调用两次save,也可以优化测试代码,只调用一次,验证1次调用即可。

内容的提问来源于stack exchange,提问作者Nunyet Calçada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:15:05