是否需要重复测试被多方法引用的仓储方法?以UserRepository.save为例
问题
我正在开发一个项目,项目中的UserRepository被其他模块引用。我想咨询:当仓储方法(如repository.save())在多处被调用时,是否需要在每个调用场景下都对该方法进行测试?
我的服务代码
@Transactional public UpdateUserDTO update(UpdateUserDTO body) throws JsonMappingException { User entity = repository.findByCpfCnpj(body.cpfCnpj()).orElseThrow( () -> new EntityNotFoundException("ENTITY NOT FOUND")); User userUpdated = mapper.updateValue(entity, body); repository.save(userUpdated); return mapper.convertValue(userUpdated, UpdateUserDTO.class); }
我的测试代码
@Test public void register_WithInvalidData_ReturnsThrowsException() { var invalidUser = UserConstants.getInvalidUser(); assertThatThrownBy(() -> repository.save(invalidUser)).isInstanceOf(RuntimeException.class); } @Test public void login_WithInvalidData_ReturnsThrowsException() { assertThatThrownBy(() -> repository.save(new User())).isInstanceOf(RuntimeException.class); }
回答
不需要在每个调用repository.save()的场景下重复测试这个方法本身的功能,核心原因和优化方向如下:
- 仓储层测试要独立聚焦:
UserRepository作为数据访问层,它的核心逻辑(比如save()的参数校验、数据持久化规则)应该在专门的仓储测试类里一次性覆盖完整——比如测合法数据能否正常保存、非法数据是否抛出预期异常、重复数据的处理逻辑等。完成这层测试后,所有业务服务调用save()时,都不需要再重复验证这些基础功能。 - 业务服务测试要盯紧业务逻辑:以你提供的
update方法为例,测试重点应该放在业务流程上:- 当传入的
cpfCnpj找不到用户时,是否抛出EntityNotFoundException - 传入的更新参数是否正确映射到用户实体
- 更新后的实体是否被正确转换为
UpdateUserDTO返回 - 用Mock框架模拟
UserRepository,断言save()方法是否被调用、传入的参数是否符合预期(比如是更新后的用户实体)
- 当传入的
- 重复测试只会增加维护负担:如果后续
save()的逻辑有变更(比如新增校验规则),重复测试的话你得修改所有调用场景下的测试代码,完全是额外的工作量,集中维护仓储层的测试才是高效做法。
另外,你当前的测试代码定位有误:直接调用repository.save()属于仓储层测试的范畴,不该放在业务服务的测试用例里。业务测试的核心是验证业务逻辑,应该Mock掉仓储实现,而不是直接操作真实的仓储。
内容的提问来源于stack exchange,提问作者Mateus Fonseca
相关产品推荐
相关产品推荐

