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是否被正确调用,不符合单元测试的验证逻辑。
解决方案
- 移除冗余的Mock初始化代码,只保留
@Mock注解即可:
@Mock private EnfantRepository enfantRepository;
- 对
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);
- 补充调用校验逻辑,验证Repository方法被正确调用,在断言之后添加如下代码:
// 验证save方法被调用了2次(你代码里先后调用了2次enfantService.save) Mockito.verify(enfantRepository, Mockito.times(2)).save(ArgumentMatchers.any(Enfant.class));
如果不需要重复调用两次save,也可以优化测试代码,只调用一次,验证1次调用即可。
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

